淘客熙熙

主题:【求助】向各位高手请教一个c语言中数组与指针的问题 -- 数值分析

共:💬84 🌺26
分页树展主题 · 全看首页 上页
/ 6
下页 末页
      • 家园 del
        • del
          家园 这不是辩论的问题

          是实践检验的问题。一个解释站不站得住,要看它的预期结果是不是与实践吻合。

          我表达可能有些问题,造成我的意思传递不出去。多么希望能有老萨的好笔头啊

    • 家园 del
      • del
        家园 其实x[0][0]可以用在f1中,只是编译器对

        x[0][0](定义:int** x)和a[0][0])(定义:int a[4][4])如何取值的解释是不同的。

        • 家园 del
          • del
            家园 理解了二维array多维array就没问题了

            一个关键之处是array(包括任何维)的名字不能做变量,就是说,名字本身不能放在等号的左边。如果是三维的array,记住array[i]和array[i][j]也都不是变量,只有array[i][j][k]是。其它高维情况类推。

            更关键的是高维指针与高维array的区别。其实LZ的问题可以抽象为:定义int **x, int a[m][n],怎样才能使x[i][j]=a[i][j]?很简单,必须首先赋值使x[0]=&a[0][0],x[1]=&a[1][0],...,x[m-1]=&a[m-1][0](或者等价的,x[0]=a,x[1]=a+1,...,x[m-1]=a+m-1)。令x=a达不到上述目的。


            本帖一共被 1 帖 引用 (帖内工具实现)
          • del
            家园 试试这段代码

            void f1( int ** x )

            {

            printf("%d\n",x[0][0]);

            }

            void main()

            {

            int a[4][4];

            int *b[4];

            a[0][0]=99;

            a[1][0]=10;

            a[2][0]=-666;

            b[0]=&a[0][0];

            b[1]=&a[1][0];

            b[2]=(int *)(a+2);

            f1( b );

            f1(b+1);

            f1(b+2);

            }

            不过我们说的可能不是一个问题。


            本帖一共被 1 帖 引用 (帖内工具实现)
            • 家园 你这个main里面

              a[0][0] = *a,不过b[0][0] != *b。楼主原文中的a和你同样定义的,当然是a[0][0] = *a了。

              你这个就是多维数组和多级间指的差别。不过这种a到b的转换太费劲,对于初学者而言也有点费解。多维数组在C里面直接定义个m*n的一维数组进行处理最简单。

            • 家园 del

              • del
                家园 把 f1(b+2);这句去掉就没问题了。
                • 家园 del
                  • del
                    家园 因为

                    b[0]=&a[0][0]推不出b[1]=&a[1][0]。在你的例子中,b[1]作为一个指针未被赋值,指针未被赋值就使用有什么后果应该知道吧。

                    再说一遍吧:b是指针变量,它的值是一个指针变量的地址;b[i]也是一个指针变量,它的值是一个整数变量的地址。a本身不是变量,你可以把它看做二维数组头地址的缩写;a[i]是数组a第i行头地址的缩写,不是变量。&a[i]导致语法错误,而&b[i]是合法的,它的值等于b+i *(int* 的长度);作为对照:a[i](不是&a[i])的值等于a+i * K *(int 的长度),其中K是最后一维的维数。麻烦的是C语言中上述两个值的表达式非常相似,分别是b+i和a+i。哈哈,头疼了吧。

                    • 因为
                      家园 del
                      • del
                        家园 你的例子很好

                        b在你的例子(熊熊熊熊:更详细的例子...)中是指针array,当你把它的首地址传递给子函数的x后,x[0]=b[0],x[1]=[1],以此类推。其实这已经是一维指针与array的函数调用问题了。既然你的b[1]=&a[1][0],所有其它问题就很好理解了。

分页树展主题 · 全看首页 上页
/ 6
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河