解除引用指向整数数组的指针

13

我有一个指向包含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?


}
3个回答

16

你所取消引用的是指向数组的指针。因此,取消引用会给你数组。将数组传递给 printf (或任何函数) 会传递第一个元素的地址。

你告诉 printf 你传递了一个 unsigned int (%u),但实际传递的是一个 int*。你看到的数字是将数组的第一个元素的地址解释为无符号整数后得到的。

当然,这是未定义的行为。如果你想打印一个地址,你必须使用 %p 并传递一个 void*


或者您可以将其转换为适当的整数类型 - 例如来自<inttypes.h>的uintptr_t,并使用适当的格式项,可能是PRIuPTR(他说,从不可靠的记忆中工作)。 - Jonathan Leffler
litb,你能解释一下“dereferencing gives you the array”的意思吗?它是指指向数组的指针吗?还是第一个元素的地址? - chappar
它会给你与仅命名“var”相同的结果:数组 :) 因此,sizeof(* ptr)== 10 * sizeof(int),且&*ptr == int(*)[10] - Johannes Schaub - litb
为了传递实际的整数,您需要进行两次解引用:**ptr,或者更冗长的 (*ptr)[0] 表示第一个元素。 - Johannes Schaub - litb
我发现这个线程,想知道为什么当我认为ptr[0]是解引用指针时,却得到了地址,并不知道它是将数组的第一个元素传递给printf函数。我尝试了**ptr和(*ptr)[0],但收到了"Invalid type argument of unary"和"Subscripted value is neither array nor pointer."的错误提示。有没有其他方法可以访问数组的值? - Crystal

11

当你声明一个变量时

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。


如果你遵循litb的建议,当打印地址时使用(void *)和%p,它们会正确地打印出来。 - Aditya Sehgal

-2

我想这可以带来更多的清晰度:

(我只是使用一小段代码减少混乱)

声明:

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]

注意:'<=====>'只是表示“意味着”的符号,没有什么特别的!!!希望我没有理解错?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接