定义指向数组的指针只需要声明一个普通的指针int *p,在函数中作为形参可以直接使用int p[]?

代替int*p,为什么定义指向二维数组的指针需要在后面加上[3]也就是int(*p)[3],在函数中也不能省略最后面的3也就是int[][3]?... 代替int*p,为什么定义指向二维数组的指针需要在后面加上[3]也就是int (*p)[3],在函数中也不能省略最后面的3也就是int[][3]? 展开
 我来答
microroom
科技发烧友

2020-08-11 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1614万
展开全部
对于形参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),计算时不依赖[]中的数字。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式