取消引用整数数组的指针

我有一个指向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] 

注意: ‘<=====>‘只是’隐含’的标志。 没什么特别的!!! 希望我没错?