2d数组中数组的名称是什么意思?

时间:2014-04-11 06:48:59

标签: c arrays

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

1 个答案:

答案 0 :(得分:2)

您无法访问地址。

运算符&的地址只能用于变量。什么是变量?例如,a中的int a;将是一个变量,它将是一个包含整数值的变量。或b中的int * b也是一个变量,一个包含地址的变量,创建所有这些语言的人决定将其称为指针cint c[10];的内容相同,但c会有一个常量变量,因此您无法改变它;但是,仍然可以得到。

的地址

您可以获取变量的地址,因为它是一些存储在某个内存位置的数据。它在记忆中占有一席之地;能够知道变量的地址是有意义的。

知道地址的地址是没有意义的。地址只是一个数字。与指针不同,我说 - 是一个包含地址的变量,它在内存中没有明确的位置供您知道。这只是一个数字,因此尝试获取&(&a);中的地址地址,与尝试将{4}的地址一样明确地用于&4时非常有意义。 / p>

至于你的例子中的&a&a[0]以及&a[0][0]每个产生相同的结果;确实,这三个变量都是从相同的内存位置开始的。但是,它们并不完全相同,它们有着重要的区别:

  • &a[0][0]是整数的地址。
  • &a[0]是2个整数数组的地址。
  • &a是包含2个整数的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
*/

所以,我想说的是,在向它们添加和减去数字时,它们会有所不同,这就是他们所谓的指针算术