西西河

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

共:💬84 🌺26 新:
分页树展主题 · 全看首页 上页
/ 6
下页 末页
    • 家园 你这个我都看糊涂了

      肯定不对,但不知道你迷糊在什么地方。C原则上没有多维数组的概念,任何多维数组实际上都是一个更长的一维数组。你这个地址传递当然是对的,C只管把地址传过去不管你传的是什么地址,自己保证正确。问题在于即使主函数里面定义了个a[m][n],函数f1里面并不知道n,你也无法重新定义,a[0][0]也许还能知道(没把握),其他的统统不知道是何物。

      C原则上是不推荐多维数组的,部分原因就在于会引起你这样的混乱。替代方法简单,开始就定义为一维数组a[m*n],使用的时候也按照这个方法使用即可。至于带两个星号的比如int **x,这个是多级间指,**x才是int数字,而多维数组的a,不管多少维,即使是int a[i][j][k][l][m][n],*a就是数字。二者完全不一样。(int **)a等于是进行了强制类型转换,把一个int指针变成了一个指向指针的指针。

      根本上,我还是建议你在C不要用多维数组,一干二净。

      • 家园 a[0][0] != *a (设a是二维数组)

        可以试一下,其实 a[0][0]=*( (int *)a )。

        • 家园 要看他这个多维数组怎么定义的

          如果是按照他在main里面定义的

          int a[5][5];

          这个a就是数组的首地址,而不是多级间指,那么*a = a[0][0]。他这个混乱就在于主函数是按照多维数组定义,在函数f1调用的时候却又当作多级间指来处理的。

          • 家园 sample code

            #include <stdio.h>

            #include <stdlib.h>

            int main()

            {

            int a[4][4];

            int c[3];

            a[0][0]=99;

            c[0]=123;

            printf("*a=%d,*((int *)a)=%d\n", *a, *((int *)a));

            printf("*c=%d\n", *c);

            //*a=2359088,*((int *)a)=99

            //*c=123

            }

            • 家园 还真有点意思,看来是我搞错了

              看来我的记忆有点错误。我这里也弄了个sample,

              #include <stdio.h>

              int f1(int *a);

              main()

              {

              int a[5][5];

              int i, j;

              for(i=0;i<5;i++)

              for(j=0;j<5;j++)

              a[i][j]=(i+1)*(j+1);

              f1(a);

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

              getchar();

              }

              int f1(int *a)

              {

              int i;

              for(i=0;i<25;i++)

              printf("I am here : %d\n",*(a+i));

              return 0;

              }

              在main里面a不能当作int *使用,但可以作为int *传给f1。在C里面所谓的多维数组我从来是弄个m*n的一维数组处理的,动态分配内存也容易,十几年了。没想到多维还真不大一样。

              还好开的药方没错。

          • 家园 括兄可以写个小程序试一下

            一维数组没问题,但多维数组就不行了。

    • 家园 似乎是概念错误

      无论是多少维德的数组,其数组名都是指针,而不是指针的指针。

      比如说你的a,尽管是二位数组,其数组名其实只是指向数组首地址的指针。具体这个数组多少维,每一维的长度是多少,那是另外的信息。

      所以如果编译器允许,你的函数应该写为

      void f1(int a[][5]),表明这是一个两维,最低维长度为5的数组。可以直接引用。

      如果编译器不支持,可以写为

      void f1(int* a)

      然而你必须知道这是个几维的数组,每维的长度是多少。

      而引用a[i][j]的时候就写为

      a[i*5+j]

      如果都不知道,就写为

      void f1(int* a, int dimension, int* dimensionLength)

      ——————————————————————

      int** a是指向指针的指针。通常用于指针数组(比如说链表之类),不可以用于多维数组

      dimension 表明这个数组是几维的,

      dimensionLength表明每一维的长度。

      • 家园 我理解int a[3][4]的a的类型不是int *

        也不是int **

        应该是int (*pa)[4]中的pa这种类型。

        也就是说a和pa都是一个指向含有4个元素的int数组的指针。只不过a是常量。

        pa++的话指针应该向下移动4*4byte。

        当然,此时a里存的地址和a[0][0]元素的地址是相同的。只不过a+1不是a[0][1]的地址,而是和a[1][0]的地址相同。还是指针的“基类型”的问题。

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


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

Copyright © cchere 西西河