【发布时间】:2014-09-15 13:40:53
【问题描述】:
我使用下面的程序通过指针访问二维数组。
#include<stdio.h>
void main()
{
int num[3][2]={ {00,01},{10,11},{20,21} };
int i,j;
printf("-----------------------------------");
/* Treating 2d array as 1d array of each row */
for(i=0;i<3;i++)
{
printf("\nThe Address(&num[%d]) is %u \n \n<= WHICH IS THE SAME AS =>\n \n(num[%d]) %u \t",i,&num[i],i,num[i]);
printf("[*(num+%d)] %u \t [(num+%d)] %u ",i,*(num+i),i,(num+i));
printf("\n The Value is %d \n",*num[i]);
printf("\n -----------------------------------");
}
}
这是输出:
-----------------------------------
The Address(&num[0]) is 2140353424
<= WHICH IS THE SAME AS =>
(num[0]) 2140353424 [*(num+0)] 2140353424 [(num+0)] 2140353424
The Value is 0
-----------------------------------
The Address(&num[1]) is 2140353432
<= WHICH IS THE SAME AS =>
(num[1]) 2140353432 [*(num+1)] 2140353432 [(num+1)] 2140353432
The Value is 10
-----------------------------------
The Address(&num[2]) is 2140353440
<= WHICH IS THE SAME AS =>
(num[2]) 2140353440 [*(num+2)] 2140353440 [(num+2)] 2140353440
The Value is 20
-----------------------------------
我了解程序中发生了什么,并且我知道*(num+i) 用于访问每一行的地址。
但是,为什么*(num+i) 和(num+i) 都指向同一个地址?
要访问特定行(第 i 行)的值,我们使用 **(num+i) 这很有意义,因为 *(num+i) 指向第一个一维数组的行地址,我们可以使用另一个间接运算符来取消引用该指针。
但是为什么*(num+i) 和(num+i) 都指向同一个地址呢?
这个编译器依赖吗?还是一些未定义的行为?
请提供尽可能多的信息。
【问题讨论】:
-
问题出在哪里?没关系,*(num + i) = (num + i)[0] 和 *((num + i)[0]) = num[i][0]