我有一个指向包含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?
}
你所取消引用的是指向数组的指针。因此,取消引用会给你数组。将数组传递给 printf (或任何函数) 会传递第一个元素的地址。
你告诉 printf
你传递了一个 unsigned int
(%u
),但实际传递的是一个 int*
。你看到的数字是将数组的第一个元素的地址解释为无符号整数后得到的。
当然,这是未定义的行为。如果你想打印一个地址,你必须使用 %p
并传递一个 void*
。
当你声明一个变量时
int var[10];
一个指向var
的引用具有指向int的指针类型,(链接到C Faq Relevant的章节)。
&var
的引用是一个指向10个int数组的指针。
您的声明int (*ptr) [10]
正确地创建了一个指向包含10个int的数组的指针,将其分配给&var
(指向一个包含10个int数组的指针的地址), (链接到C Faq Relevant的章节)。
有了这些理解,ptr
将打印指向包含10个int的数组的指针的基地址。
*ptr
将打印包含10个int数组的第一个元素的地址。
在这种情况下,它们两者相等,这就是为什么您看到相同的地址。
是的,**ptr将给你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]
注意:'<=====>'只是表示“意味着”的符号,没有什么特别的!!!希望我没有理解错?
<inttypes.h>
的uintptr_t,并使用适当的格式项,可能是PRIuPTR(他说,从不可靠的记忆中工作)。 - Jonathan Lefflersizeof(* ptr)== 10 * sizeof(int)
,且&*ptr == int(*)[10]
。 - Johannes Schaub - litb**ptr
,或者更冗长的(*ptr)[0]
表示第一个元素。 - Johannes Schaub - litb