我有一个指向10的整数数组的指针。取消引用这个指针应该给我什么?
例如:
#include<stdio.h>
main()
{
int var[10] = {1,2,3,4,5,6,7,8,9,10};
int (*ptr) [10] = &var;
printf("value = %u %u\n",*ptr,ptr); //both print 2359104. Shouldn't *ptr print 1?
}
答案 0 :(得分:15)
您取消引用的是指向数组的指针。因此,解除引用会为您提供数组。将数组传递给printf(或任何函数)会传递第一个元素的地址。
您告诉printf
您传递了unsigned int
(%u
),但实际传递的是int*
。您看到的数字是解释为unsigned int的数组的第一个元素的地址。
当然,这是未定义的行为。如果您要打印地址,则必须使用%p
并传递void*
。
答案 1 :(得分:11)
宣布
时int var[10];
对var
的引用具有类型指向int (Link to C Faq Relevant's section)的指针。
对&var
的引用是指向10个整数的数组的指针。
您的声明int (*ptr) [10]
正确地创建了一个指向10个整数数组的指针,您指定{1}}(指向10个整数数组的指针的地址)(Link to C Faq Relevant's section)。
希望这些事情清楚明白,&var
然后会打印指向10个整数的数组的基地址。
ptr
将打印 10个整数数组的第一个元素的地址。
在这种情况下,它们都是相同的,这就是为什么你看到相同的地址。
是的,*ptr
答案 2 :(得分:-3)
我想这可以带来更多的清晰度:
(我只是使用一段代码来减少混乱)
<强>声明:强>
int a[5];
a[5] = {0,1,2,3,4);
<强>的间接强>
ptr = a <======> ptr = &a[0]
<强>解引用强>
*ptr = *a <======> *ptr = *&a[0]
*ptr = a[0]
因此,我们可以写:
*(ptr + i) = *(a + i) <======> *(ptr + i) = a[i]
注意:'&lt; =====&gt;'只是'暗示'的标志。没什么特别的!!! 希望我没错?