【发布时间】:2019-01-09 02:57:18
【问题描述】:
int arr5[][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
声明二维数组的变量包含指向第一个数组中第一个元素的指针。 arr5 被定义为每行有 3 列。 arr5 加 1 得到第二行第一个元素的地址,arr5 加 2 得到第三行第一个元素的地址。
int *row1 = arr5;
int *row2 = arr5 + 1;
int *row3 = arr5 + 2;
取消引用指向数组的指针会获取数组中的第一个元素。
printf("%d\n", *row1); // prints 1
printf("%d\n", *row2); // prints 4
printf("%d\n", *row3); // prints 7
我们可以使用 [] 取消引用这些行中的元素。
for (j = 0; j < 3; j++) {
printf("%d%c", row1[j], (j==2)?'\n':' ');
} // prints 1 2 3
我们可以不使用括号打印第二行。 Row2 现在保存第二行中第一个元素的地址。
for (j = 0; j < 3; j++) {
printf("%d%c", *(row2+j), (j==2)?'\n':' ');
} // prints 4 5 6
为什么我们不能在上面的例子中用 arr5+1 代替 row2? row2 保存地址 arr5+1。
for (j = 0; j < 3; j++) {
printf("%d%c", *((arr5+1)+j), (j==2)?'\n':' ');
} // prints what looks to be addresses
【问题讨论】:
-
int *row1 = arr5;是个问题。row1是int*,arr5不是。arr5是(int*)[3]。int *row1 = *arr5;和int *row2 = *(arr5 + 1);一样可以 -
int *row1 = arr5;没有问题。 printf("%d\n", *row1);按预期打印第一行中的第一个元素。
-
这只是在快乐的情况下。打开编译器警告,例如
-Wall -Wextra -pedantic用于 gcc/clang 或/W3用于 VS。 "警告:从不兼容的指针类型初始化" -
当样本阵列不是方形阵列时,二维阵列问题更加清晰。考虑一个 3x4 数组。
-
第一句错了。没有指针。该数组是 9 个连续的
int对象。
标签: c arrays pointers multidimensional-array