【问题标题】:Pointers and Arrays: pointer to pointers指针和数组:指向指针的指针
【发布时间】:2013-10-08 05:18:41
【问题描述】:

我不知道以下事情是如何工作的?

void main()
{
    static int a[] = {10, 12, 23, 43, 43};
    int *p[] = {a, a + 1, a + 2, a + 3, a + 4};
    int **ptr = p;
    ptr++;
    printf("%d,%d,%d", ptr - p, *ptr - a, **ptr);
}

这将输出为1 1 10。我知道**ptr 给出了存储在ptr 的值,但为什么ptr-p 给出1 不应该给出sizeof(int)

【问题讨论】:

标签: c pointers


【解决方案1】:

为了解释输出,我注释了代码 sn-p:

#include <stdio.h>                                                                                                 

int main()                                                                                                         
{                                                                                                                  
   // a is an array of integers                                                                                    
   static int a[]={10, 12, 23, 43, 43};                                                                            

   // p is an array of integer pointers. Each of the element, holds address of elements in array "a"               
   // p[0] = &a[0], p[1] = &a[1], p[2] = &a[2], p[3]=&a[3], p[4]=&a[4]                                             
   int *p[]={a, a + 1, a + 2, a + 3, a + 4};                                                                       

   // ptr is a pointer to an integer pointer. Ptr holds base address of array "p"                                  
   // ptr = &p[0]                                                                                                  
   // *ptr = *(&p[0]) = p[0]                                                                                       
   // **ptr = *(p[0]) = *(&a[0]) = a[0] = 10                                                                       
   int **ptr = p;                                                                                                  

   // ptr was pointing to zeroth element in the p array, which is p[0].                                            
   // Incrementing pointers, makes it to move by X bytes and hence point to the next element.                      
   // where X = sizeof(int *). int* is p's datatype.                                                               
   ptr++;                                                                                                          

   // ptr = &p[1]                                                                                                  
   // *ptr = *(&p[1]) = p[1]                                                                                       
   // **ptr = *(p[1]) = *(&a[1]) = a[1] = 12                                                                       

   // pointer difference is measured by the number of elements                                                     
   // since ptr points to p+1. difference is 1                                                                     
   printf("ptr - p: %p\n", (void*)(ptr - p) );                                                                     

   // ptr holds address of p+1. *ptr holds value of p[1], which as explained in the above holds address of a[1].   
   // Hence difference of (a+1) - a is 1                                                                           
   printf("*ptr - a: %p\n", (void* )(*ptr - a));                                                                   

   // ptr holds address of p+1. *ptr holds address of a[1]. **ptr holds value of a[1].                             
   printf("**ptr: %d\n", **ptr);                                                                                   
   return 0;                                                                                                       
}

有 printf 语句并验证我在程序中提供的 cmets 以便更好地理解。

例如。比较 p[0]&amp;a[0]。比较*p[3]a[3]

希望代码和 cmets 对您有所帮助。

提供的代码是可编译的,我的屏幕上的输出是

ptr - p: 0x1
*ptr - a: 0x1
**ptr: 12

【讨论】:

  • 非常好的解释,我建议不要将有用的陈述作为评论。在主要部分中逐点解释。
  • 在你的文本中你应该使用&lt;code&gt;编写编程术语:"Compare &lt;code&gt;p[0]&lt;/code&gt; and &lt;code&gt;&amp;a[0]&lt;/code&gt;. Compare &lt;code&gt;*p[3]&lt;/code&gt; and &lt;code&gt;a[3]&lt;/code&gt;."
【解决方案2】:

在指针运算中,ptr - p 将输出从pptr 的元素的数量,而不是从pptr大小 .元素的大小无关紧要。

顺便说一句,您的代码无法编译。说明您的问题的最小示例如下所示:

#include <stdio.h>

int main()
{
    static int a[] = {10,12,23,43,43};
    int *p = a;
    int *ptr = p;
    ptr++;
    printf("%p %p %d\n", (void*)ptr, (void *)p, ptr - p);
    return 0;
}

我的机器上的输出:

0x600b44 0x600b40 1

【讨论】:

  • 甚至可以printf("%p %p %d\n",ptr,p,ptr-p); 来演示地址的差异算术差异。
  • @glglgl 那更好,我会用它:)
【解决方案3】:

指针运算是使用所指向元素的大小来完成的。由于您在ptr 上使用了++,因此无论ptr 是什么类型,区别都将是1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 2023-03-11
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多