代码:

int int_array[5] = {1, 2, 3, 4, 5};
std::cout << int_array << " " << &int_array << " " << *(&int_array) << " " << **(&int_array) << " " << " " << *(int_array) << std::endl;   
   
for (int i=0;i<5;i++) {
  std::cout << i << " " << int_array[i] << " " << &int_array[i] << " " << *(&int_array[i]) <<  std::endl;
} 

输出:

0xd1a03ff9e0 0xd1a03ff9e0 0xd1a03ff9e0 1  1
0 1 0xd1a03ff9e0 1
1 2 0xd1a03ff9e4 2
2 3 0xd1a03ff9e8 3
3 4 0xd1a03ff9ec 4
4 5 0xd1a03ff9f0 5

数组表:

价值 地址
1 0xd1a03ff9e0
2 0xd1a03ff9e4
3 0xd1a03ff9e8
4 0xd1a03ff9ec
5 0xd1a03ff9f0

int_array&int_array*(&int_array)的输出均为 0xd1a03ff9e0。

为什么*(&int_array)等于0xd1a03ff9e0?正如我们所看到的,&int_array0xd1a03ff9e0,所以不应该*等于0xd1a03ff9e01 吗?

int_array变量值和内存是什么样的?

5

  • 4
    代码中没有引用。在您的代码中&是 addressof 运算符


    – 

  • 2
    问你的问题: &int_array 的类型是什么?


    – 

  • 旁注:这段代码中没有任何内容需要额外的东西std::endl。用于'\n'结束一行,除非您有充分的理由不这样做。


    – 

  • 这回答了你的问题了吗?


    – 

  • 1
    数组的地址值和数组第一个元素的地址值具有相同的值。他们没有相同的类型。


    – 


1 个回答
1

数组不是指针,也不是单个元素。

为什么*(&int_array)等于0xd1a03ff9e0

int_array是一个数组。

&是取址运算符。&int_array是一个指向 5 个整数数组的指针,即int(*)[5]

*是解引用运算符。*(&int_array)是原始数组。

当您将数组传递给函数时,它会衰减为指向其第一个元素的指针,即int*。指向第一个元素的指针的值与指向整个数组的指针的值相同(但它们是不同的类型!)。这将我们带到…

int_array变量值和内存是什么样的?

数组由连续的元素组成:

[ 0 ][ 1 ][ 2 ][ 3 ][ 4 ]    // < - 5 consecutive integers in memory
  ^
  pointer to the array &int_array points here
  ^
  pointer to first element &int_array[0] points here

同样,您可以看到指向的指针的值int_array与指向其第一个元素的指针的值相同,因为数组从内存中的第一个元素开始。第一个元素之前没有任何内容。


那里有很多糟糕的教程。我似乎有些人声称这int_array将是一个指针。但是混淆数组和指针会导致更多的混乱。通俗地说,我们说int* p = new int[42];是指向数组的指针。通俗地说,这是可以的,但是将指向数组的指针与指向单个元素的指针混淆会导致您的问题出现混乱。因此,数组不是指针,也不是单个元素。

2

  • 太困了,无法校对我自己的帖子。相反,支持你:-)


    – 

  • @Ted FWIW 当你删除它时我正在读它。到目前为止看起来还不错(相当远)。恕我直言,如果没有关于这个主题的长篇论文,很难公正地回答这样的问题。根据我的经验,简短的解释并不适合初学者,甚至很多“资深”人士。如果不进行大量练习,神秘(神秘)的语法就已经足够困难了,但我认为最大的问题是让人们理解数组本身就是一个对象。一旦人们看到这一点并通过大量练习获得“分块”技能,数组甚至所谓的二维数组就会变得容易得多。


    –