最近在看蔡明志的《指针的艺术》,觉得第三章中关于数组指针的描述有点问题(原书第35页,章节3-3)。原话就不再列出来了,免得又误导了自己。
在网上找了一下,基本都一致(和蔡明志书上的不一样哦):
指针数组,就是指针的数组,数组的元素是指针;如: int *p[10]; // 含有10个指向int值的指针。
数组指针,就是指向数组的指针。 如: int (*p)[10]; // 这个指针指向含有10个int值的数组。
原因在于[]的优先级比*高。
再加个测试代码:
#include <stdio.h>
int main() {
int i[][3] = {10, 20, 30, 40, 50, 60};
int (*ptr)[3];
int a, b, total = 0;
for (a = 0; a < 2; a++)
for (b = 0; b < 3; b++)
printf("&i[%d][%d] = %x\n", a, b, &i[a][b]);
printf("\n");
for (a = 0; a < 2; a++)
for (b = 0; b < 3; b++)
printf("i[%d][%d] = %d\n", a, b, i[a][b]);
ptr = i;
printf("\n");
printf(" ptr = %x\n *ptr = %x\n i[0] = %x\n i = %x\n *i = %x\n", ptr, *ptr, i[0], i, *i);
for (a = 0; a < 2; a++)
for (b = 0; b < 3; b++)
total += *(*(ptr + a) + b);
printf("Sum1 = %d\n", total);
total = 0;
for (a = 0; a < 2; a++)
for (b = 0; b < 3; b++)
total += *(ptr[a] + b);
printf("Sum2 = %d\n", total);
total = 0;
for (a = 0; a < 2; a++)
for (b = 0; b < 3; b++)
total += ptr[a][b];
printf("Sum3 = %d\n", total);
return 0;
}
测试结果:
&i[0][0] = c6937bd0
&i[0][1] = c6937bd4
&i[0][2] = c6937bd8
&i[1][0] = c6937bdc
&i[1][1] = c6937be0
&i[1][2] = c6937be4
i[0][0] = 10
i[0][1] = 20
i[0][2] = 30
i[1][0] = 40
i[1][1] = 50
i[1][2] = 60
ptr = c6937bd0
*ptr = c6937bd0
i[0] = c6937bd0
i = c6937bd0
*i = c6937bd0
Sum1 = 210
Sum2 = 210
Sum3 = 210
分析如下:
for (a = 0; a < 2; a++)
for (b = 0; b < 3; b++)
total += *(*(ptr + a) + b);
两次外循环:第一次,将第一行的三个值相加;第二次,将第二行的三个值相加。
因为 *(ptr + a) = ptr[a],*(ptr[a] + b) = ptr[a][b],所以可以换成另外两种取值的方式:
total += *(ptr[a] + b);
total += ptr[a][b];