我的代码打印三个元素数组的值。
我的问题为什么结果是正确使用printf("Value at %p = %d\n", ptr2arr +i, *(ptr2arr[0]+i));
使用printf("value at %p =%d\n" ,ptr2arr+i,*(ptr2arr[i]))
#include <stdio.h>
int main(int argc, char* argv[])
{
int arr[3] = {1,2,3};
int (*ptr2arr)[3];
int i;
ptr2arr = &arr;
for(i = 0; i<3; i++)
{
printf("Value at %p = %d\n", ptr2arr +i, *(ptr2arr[0]+i));
}
printf("-------------------\n");
for(i = 0; i<3; i++)
{
printf("value at %p =%d\n" ,ptr2arr+i,*(ptr2arr[i]));
}
return 0;
}
`
答案 0 :(得分:2)
表达式ptr2arr[0]
与*ptr2arr
相同,因此它取消引用指向3 int
的数组的指针,为您提供有效的数组arr
。因此,*(ptr2arr[0] + i)
与*(*ptr2arr + i)
相同,与*(arr + i)
相同,可为您提供正确的结果。
而在
行printf("value at %p =%d\n" ,ptr2arr+i,*(ptr2arr[i]));
ptr2arr[i]
(ptr2arr + i
的语法糖)“跳过”3个int
的数组,所以取消引用它*(ptr2arr[i])
仅在arr[0]
时{ {1}},否则它会为您提供位于地址i = 0
的内容(未定义的行为)。
PS:传递给arr + 3*sizeof i
的地址应为printf
,而不是*ptr2arr + i
。
有关详细信息,另请参阅dereferencing pointer to integer array。