定义指向数组的指针只需要声明一个普通的指针int *p,在函数中作为形参可以直接使用int p[]?
代替int*p,为什么定义指向二维数组的指针需要在后面加上[3]也就是int(*p)[3],在函数中也不能省略最后面的3也就是int[][3]?...
代替int*p,为什么定义指向二维数组的指针需要在后面加上[3]也就是int (*p)[3],在函数中也不能省略最后面的3也就是int[][3]?
展开
1个回答
展开全部
对于形参int p[][3]实际上等同于int (*p)[3],都是将p定义成了一个指向数组的指针,就是说p可以指向一个具有3个int型元素的数组。
可以像这样使用:
void f(int p[][3])
{}
int arr1[3];
int arr2[2][3];
//以下两种调用方式都对
f(&arr1);
f(arr2);
那为什么int p[][3](或int (*p)[3])必须写上一个数字呢?因为指向数组的指针的移动是以数组为单位的,p++,p+=1都是移动一个数组的内存大小,如果是3,就移动3*sizeof(int)个字节,而p+=2就是移动两个数组的内存大小。
可以将int (*p)[3]理解成int[3] *p;即p的移动是以int[3]为单位的。从这就可以看出数字3是必须的,不能省略,否则就无法计算出移动的单位是多少字节。而int *p(或int p[])之所以可以省略[]中的数字,是因为移动单位就是sizeof(int),计算时不依赖[]中的数字。
可以像这样使用:
void f(int p[][3])
{}
int arr1[3];
int arr2[2][3];
//以下两种调用方式都对
f(&arr1);
f(arr2);
那为什么int p[][3](或int (*p)[3])必须写上一个数字呢?因为指向数组的指针的移动是以数组为单位的,p++,p+=1都是移动一个数组的内存大小,如果是3,就移动3*sizeof(int)个字节,而p+=2就是移动两个数组的内存大小。
可以将int (*p)[3]理解成int[3] *p;即p的移动是以int[3]为单位的。从这就可以看出数字3是必须的,不能省略,否则就无法计算出移动的单位是多少字节。而int *p(或int p[])之所以可以省略[]中的数字,是因为移动单位就是sizeof(int),计算时不依赖[]中的数字。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询