如果是这样的代码:
int a[3][5]={{1,2,3},{4,5,6},{7,8,9}};
int *p=&a[0][0];
这里p是一个普通的指向整型指针的指针变量,那么p可以存放任意一个整型变量的地址(const的除外)
又由于数组(不管是不是多维的)在内存中实际上是线性存放的,即:
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1][0] a[1][1] a[1][2] ...
所以(p+1)就表示a[0][1]的地址,所以 *(p+1)表示的是a[0][1]
但是要是代码是这样的:
int a[3][5]={{1,2,3},{4,5,6},{7,8,9}};
int (*p)[5]=a;//&a[0]
这时候p是指向有五个元素的行指针,其具体含义就是p把数组的元素分组了,每五个元素算一组,就是说(p+1)直接指向下一组的第一个元素,就是a[1][0],要是这样的话,那*(p+1)表示的是a[1][0]
另外:
对于int (*p)[5],这个p只能指向以五个元素为一组的地址,如:
int a[3][5][5];
int (*p)[5]=&a[i][j];
其中i>=0&&i<=2 j>=0&&j<=4,因为这里&a[i][j]都是指向含有5个元素的子数组,所以这样也是对的
为什么一定要指向五个元素的指针呢,因为这告诉编译器p+1,是什么意思了:
加了1后到底指向什么位置,对于这里的例子,加1后,直接指向下一组(一组五个)元素的开头了,就是p+1 换算成加的字节数就是:p+1*5*4,5是,每组5个,4是每个元素4字节(int是4字节),而对于普通指向整型变量的指针p,p+1 换算成字节数就是 p+1*4,直接指向下一个4byte的内存。这也是为什么指针形参的函数虚实结合的数据类型要一样,要不加1,实际加的字节数不一样会导致错误,而非指针形参只要求赋值兼容即可了
温馨提示:答案为网友推荐,仅供参考