取消引用整数数组的指针
我有一个指向10的整数数组的指针。取消引用这个指针应该给我什么?
例如:
#include 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? }
您取消引用的是指向数组的指针。 因此,解除引用会为您提供数组。 将数组传递给printf(或任何函数)会传递第一个元素的地址。
你告诉printf
你传递了unsigned int
( %u
),但实际传递的是int*
。 您看到的数字是解释为unsigned int的数组的第一个元素的地址。
当然,这是未定义的行为。 如果要打印地址,则必须使用%p
并传递void*
。
当你申报时
int var[10];
对var
的引用具有指向int的类型指针 (链接到C Faq Relevant的部分) 。
对&var
的引用是指向 10个int 的数组的指针 。
你的声明int (*ptr) [10]
正确地创建了一个指向10 int的数组的指针,你指定了&var
int(指向10个int的数组的指针的地址) (链接到C Faq Relevant的部分) 。
有了这些东西希望清楚, ptr
然后将指针的基地址打印到 10个int 的数组 。
*ptr
然后将打印10个整数数组 的第一个元素的地址 。
在这种情况下,它们都是相同的,这就是为什么你看到相同的地址。
是的, **ptr would give you 1.
我想这可以带来更多的清晰度:
(我只是使用一段代码来减少混乱)
宣言:
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]
注意: ‘<=====>‘只是’隐含’的标志。 没什么特别的!!! 希望我没错?