c语言二维数组的数组指针为什么是(*p)[n]而不是(*p)[m],我觉得c[m][n]里有m个数组,每个数组又有n个元素 C语言指针定义二维数组*p[N]怎么理解 N代表行还是列,行...

作者&投稿:无狡 (若有异议请与网页底部的电邮联系)
一楼,当然有区别!
对于这个问题,必须先理清两个问题。
1、指针数组与数组指针的区别。
指针数组是以指针为单位的元素集合,而数组指针是指向某数组首地址的单个指针。
2、指针的移动规则。
指针要移动,必须先知道当前所指内容的大小,进而确定其移动的步长,步长等于其所指内容字节数。
综上所述,问题已经很明了。楼主所述为数组指针,而非指针数组。既然是指向某个数组的指针,那么必须确定这个指针所指数组的大小,这样指针才能知道如何去移动。
最后举个例子:str[3][4]={"abc","def","ghi"}如有定义:
(*p1)[4]=str,则printf("%s",p1[2])打印出的是ghi,
而(*p2)[3]=str,则printf("%s",p2[2])打印的却是f,为什么?因为指针p2的步长为3,所以打印其时是从数组的第7个字符开始,遇字符串def后面空字符结束,所以结果为f。
楼主,希望我的讲解已让你有所收获!

呃 一楼的错了呃 !
M是行 N是列呃!

你说的没错,那个是[m]行,[n]列,但是(*p)已经代表了m来表示行,它是地址不是值!不知道我说的你懂不懂!

有区别吗?m是列n是行

求C语言高手指点:请问如何指针定义二维数组?? 请用 **p ,(*P)[ ] ,*p[ ] 三种来进行指针定义~

int a[4][5],*p[4],i; //p表示指针数组
for( i=0;i<4;i++ )
p[i]=a[i];
/*有了这个定义后,指针数组p中的每一个指针分别指向了二维数组a每一行的首地址,以后通过p就可以访问a */
访问格式:p[i][j] , (*(p+i))[j] , *(*(p+i)+j) , *(p[i]+j) 都表是a[i][j]
eg: p[1][1]=1; //相当于a[1][1]=1;

_______________________________________________________________________

int a[4][5],(*p)[5]; //p表示数组指针
p=a;
/*有了这个定义后,数组指针p指向了二维数组a的首地址,以后通过p就可以访问a */
访问格式:p[i][j] , (*(p+i))[j] , *(*(p+i)+j) , *(p[i]+j) 都表是a[i][j]
eg: p[1][1]=1; //相当于a[1][1]=1;

______________________________________________________________________

**p主要用在函数传值上,如:

main()
{ int a[4][5],*p[4],i;
for( i=0;i<4;i++ )
p[i]=a[i];
……
fun (p );
……
}

这是fun 函数的首部就可以表示成:
fun( int **p )
{ p[1][1]=1; //相当于主函数中的a[1][1]=1;
……
}

如果是这样定义:
int p[7][8];

那么p[3]就是一个 int类型的数组,数组有8个成员,p[3]是这个数组的首地址,*p[3]是这个数组的第一个成员,即p[3][0]

求助:C语言二维数组指针问题
答:神奇的是对数组而言,a、a[0]、*a的值是一样的,都是0x99!你可能会想这不可能吧 但如果你使用*a操作,你会发现效果就是等价于a[0],不会直接取值(指向数组的指针的奇怪之处)此时a的值是0x99 a赋给p的值是0x99 而对p来说就不一样(p不是指向数组的指针),*p真的是对那个地址的内存取值...

C语言程序设计中"二维数组中元素指针的表示"的例题,求详解
答:二维数组和指针 ⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。一个二维数组在计算机中存储时,是按行存储的,即先存储第一行的元素,再存储第二行的元素。当把每一行看作一个整体,即作为一个大的数组元素时,原来的二维数组也就变成一个一维数组了...

在数组指针中为什么是*(p+1)+2而不是(p+1)+2表示数组a第一行第二列的...
答:若定义数组 int a[3][4],*p=a[0];将二维数组看成是一维数组,即 a[3]这个部分为一维数组的数组名,[4]这部分看成为一维数组的元素个数。这样就有数组名为a[0]的一维数组,其元素为a[0][0],a[0][1]……等等。而*(p+0)就是a[0],且是个地址,代表理解上的一维数组名。*(p+1)...

C语言:关于二维数组的指针问题, 对于一维数组来说,数组a[i]的数组名...
答:比如a[3][4]是不是代表3个一维数组,一维数组的大小是4 那么第一个数组的数组名是a[0],然后a[0]这个数组里面有四个元素分别为{a[0][0],a[0][1],a[0][2],a[0][3]},第二个数组名是a[1],以此类推 二维数组相当于也是一个数组,里面装的都是一位数组a[3] = {a[0],a[1]...

C中的数组名指针怎么理解?
答:,把一维的指针二维化(好好体会)这也说明二维数组在内存中也是线性而已,只是按行存的(下面有举例)(当然指针和数组还是有区别的,不过对该问题没影响,所以就不要给你乱上乱了)先给你讲讲二维数组吧如:int A[3][4];<---定义了一个3行2列的数组你可以这样想像它的内存是这样分布的:A...

C语言指向二维数组的指针
答:在调用的过程中,float 指向的是 xx。一个浮点数字。两个的定义不同,所以参数传递过程中会出错。三、你的 float (*p)[4] 定义的是:一个指向含有四个元素的浮点数组的指针。在调用的过程中,float 指向的是{xxx,xx,xx,xx,},由四个浮点数组成的数组。这时两个定义相同,所以参数传递...

c++题目, 假定a是一个二维数组,则a【i】【j】的指针访问方式为什么?
答:二维指针是指向指针的指针...比方说int a[2][2];那么 a就是一个指针,他的值指向a[0],即a[0]的内存地址.a[0]也是一个指针,所以a是一个指向指针的指针.a[0]的值指向a[0][0],即a[0][0]的地址.如果将数组用指针访问的话:a[i][j] = *(*(a+i)+j)同理,多维数组的访问:a[i...

c语言二维数组与指针,我想知道为什么*(a+1).与显示中的a+1,所给出的...
答:要是不理解,记住套用即可 一个*是指针 所以ij都是指针 a+1是一个指针,表示第1行的首地址(c中数组时从0开始计数的)在二维数组中,a,a[0],&a[0][0]这三个指针虽然都是a的首地址的值,但是在c中用起来是不一样的 a表示二维数组的首地址 a[0]表示第0行的首地址 &a[0][0]表示第...

C语言二维数组指针变量是什么,int (*p)[2]什么意思
答:int (*p)[4]定义了一个指针p,指向一个4个元素的数组。只是定义一个指针,指向4个元素的数组 int p[4]定义了一个数组指针p[4],p的每个元素指向一个整型的数据。就 是数组里面保存的是指针 (1)int p[2]是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型。可...

在二维数组中,行指针是指向一维数组的指针变量.
答:然而二维数组中的行宽是确定,也是必须的,因此二维数组的行宽必须明确,因此其指针定义必须包含行宽信息。type (*)[n] 是行指针类型格式,方括号内的n就是指示行宽,因此行指针不是简单的一维数组指针,而是被限定宽度的一维数组指针,这就是区别。归纳一下 一维数组指针定义格式:type *p 二维数组行...