取消引用整数数组的指针

时间:2009-07-05 05:08:48

标签: c pointers

我有一个指向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 个答案:

答案 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;'只是'暗示'的标志。没什么特别的!!! 希望我没错?