gpt4 book ai didi

c - 二维数组中数组的名称指向什么?

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:10 25 4
gpt4 key购买 nike

我有一个数组a[2][2]。现在可以认为它由两个一维数组组成,a[0]a[1]。现在由于数组的名称指向数组中的第一个元素,所以 a[0]a[0][0] 的地址,即 a[0] = &a[0][0]。还有 a = &a[0] 根据定义。因此,结合这两个 a = &(&a[0][0]);但是当我打印 a 时,它只给出了 a[0][0] 的地址,即 &a[0][0]。这是为什么?

最佳答案

您无法访问地址的地址。

寻址运算符&,只能用于变量。什么是变量?例如,int a; 中的 a 将是一个变量,它将是一个包含整数值的变量。或者 int * b 中的 b 也将是一个变量,一个保存地址的变量,创建所有这些语言的人决定将其称为 指针int c[10]; 中的 c 也是一样,除了 c 会有一个常量变量,所以你不能改变它;但是,仍然可以获得地址。

您可以获得变量的地址,因为它是为您存储在某个内存位置的一些数据。它在内存中有一个明确的位置;能够知道变量的地址确实有意义。

知道一个地址的地址是没有意义的。地址只是一个数字。与指针不同,正如我所说的,它是一个保存地址的变量,它在内存中没有明确的位置供您知道。它只是一个数字,所以尝试使用 &(&a); 中的地址的地址,与尝试使用 &4 中的数字 4 的地址一样有意义 出乎意料。

至于您的示例中的每个 &a&a[0]&a[0][0] 都会产生同样的结果;的确,所有这三个变量都从相同的内存位置开始。然而,它们并不完全相同,它们有一个重要的区别:

  • &a[0][0]是一个整数的地址。
  • &a[0] 是 2 个整数数组的地址。
  • &a 是 2 个整数数组的地址。

所以他们在内存中指向的是不同的,像这样:

// I'll use char so the bit-representation won't take long
char a[2][2] = {
{ 1, 2 },
{ 3, 4 }
};

/*
&a is the address of this whole thing:
0000 0001 0000 0010 0000 0011 0000 0100 .... ....
^ &a here ^ &a + 1 here

&a[0] is the address of this whole thing:
0000 0001 0000 0010 .... ....
^ &a[0] here ^ &a[0] + 1 here

&a[0][0] is the address of just this:
0000 0001 .... ....
^ &a[0][0] ^ &a[0][0] + 1
*/

所以,我想说的是,当涉及到对数字进行加减时,它们会有所不同,这就是他们所说的指针算术。 p>

关于c - 二维数组中数组的名称指向什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23005427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com