【问题标题】:dereferencing pointer to integer array取消引用指向整数数组的指针
【发布时间】:2009-07-05 05:08:48
【问题描述】:

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


}

【问题讨论】:

    标签: c pointers


    【解决方案1】:

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

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

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

    【讨论】:

    • 或者您可以转换为适当的整数类型 - 例如从 '&lt;inttypes.h&gt;' 转换为 uintptr_t 并使用适当的格式项,可能是 PRIuPTR(他说,从片状内存中工作)。
    • litb,你能解释一下“解除引用给你数组”是什么意思吗?它又是指向数组的指针吗?还是第一个元素的地址?
    • 它给你的效果与命名“var”给你的效果一样:数组:) 因此,sizeof(*ptr) == 10*sizeof(int)&amp;*ptr == int(*)[10]
    • 要传递实际的整数,您必须取消引用两次:**ptr,或者更冗长的(*ptr)[0] 用于第一个元素。
    • 我发现这个线程想知道为什么当我认为 ptr[0] 取消引用指针并且不知道它正在将数组的第一个元素传递给函数 printf 时我得到地址。我尝试了 **ptr 和 (*ptr)[0] 并收到“无效的一元类型参数”和“下标值既不是数组也不是指针”。有没有其他方法可以访问数组的值?
    【解决方案2】:

    当你声明时

    int var[10];
    

    var 的引用具有类型指向int 的指针 (Link to C Faq Relevant's section)

    &amp;var 的引用是一个指向10 个整数数组的指针

    您的声明 int (*ptr) [10] 正确地创建了一个指向 10 个整数数组的指针,您将 &amp;var(指向 10 个整数数组的指针的地址)(Link to C Faq Relevant's section) 分配给该指针。

    希望清楚这些事情后,ptr 将打印 指向 10 个整数数组的指针的基址

    *ptr 然后会打印 10 个整数数组的第一个元素的地址

    在这种情况下,它们都是相等的,这就是为什么您看到相同的地址。

    是的,**ptr would give you 1.

    【讨论】:

    • 当然,如果您遵循 litb 的建议,它会正确打印这些内容。打印地址时使用 (void *) 和 %p。
    【解决方案3】:

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

    (我只是使用sn-p的代码来减少混乱)

    声明:

    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]
    

    注意:“”只是“暗示”的标志。没什么特别的!!! 希望我没看错??

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-25
      • 2011-10-20
      • 1970-01-01
      • 2021-11-01
      • 2021-03-27
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多