【问题标题】:c/c++ pointer to an array vs pointer to a pointerc/c++ 指向数组的指针与指向指针的指针
【发布时间】:2013-11-02 19:54:41
【问题描述】:

我认为数组和指针基本上是一回事,直到我运行这个程序:

int main() {
  int* a = new int(19);
  int b[1];
  b[0] = 19;

  printf("*a: %d\n a: %p\n &a:%p\n", *a, a, &a);
  printf("*b: %d\n b: %p\n &b:%p\n", *b, b, &b);
  delete a;
}

输出是:

*a: 19
 a: 0x7f94524000e0
 &a:0x7fff51b71ab8
*b: 19
 b: 0x7fff51b71ab4
 &b:0x7fff51b71ab4

谁能解释一下为什么 &b 的输出和 b 一样?

谢谢! -尔本

【问题讨论】:

  • 这种数组是指程序中的死内存,与指针不同。指针可以指向任何地址。另一件事:如果您使用int tab[n][m],则不能将其与int **ptr 一起使用,但与int *ptr 一起使用-> 编译器会将对tab[i][j] 的调用替换为tab[i * m + j]

标签: c++ c arrays pointers


【解决方案1】:

嗯,b 是一个数组。在最轻微的借口下,它将衰减为指向b 的第一个元素的指针。但是请注意,表达式b&b 等价的:b 衰减为指针的第一个元素,即它是int* 类型,而&b 是指向数组的指针,即它的类型为int(*)[1]

【讨论】:

  • 但是为什么 a 和 &a 不同呢?
  • @Robertfrost: a&a 显然指向不同的实体:a 是一个对象,它恰好是指向 int 的指针,&a 是该对象的地址,即,它是指向int 的指针。但是,数组很特殊:如果您只是命名并计算它们,它们会自动变成指向其第一个元素的指针,即b 等价于&b[0]。该元素与从&b 获得的数组对象的起始地址相同。
  • @Robertfrost:请参阅this answer 了解一些历史背景。
【解决方案2】:

数组和指针不一样。指针的行为类似于数组(例如,按索引访问)。

&b 是指向整个数组的指针,b 是指向第一个元素的指针。它们可能指向内存中的相同地址,但它们是完全不同的东西。

        +-------------------------------+  
        |+-----+-----+-----+-----+-----+|  
        ||     |     |     |     |     ||  
 &b---->||  0  |  1  |  2  | ... |  N  ||  
        ||     |     |     |     |     ||  
        |+-----+-----+-----+-----+-----+|  
        +---^---------------------------+  
            |                              
            b                              

【讨论】:

  • a 和 &a 是两个不同的值,因为一个是那个“0”的地址,一个是那个“a”的地址。但是在 b 中,您只有一个框,因此只有一个内存地址。
【解决方案3】:

a 是一个变量。您正在使用new 分配内存并将结果分配给此指针。您可能会决定稍后在程序中将其他内容存储在 a 中。

b 不同。它不是一个变量,因为它不能存储不同的地址。它是一个数组,具有固定的起始位置。

因此,b&b 是相同的。但是a的内容和a的实际地址不同。

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-12-31
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多