我有一个数组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]
。那是为什么?
答案 0 :(得分:2)
您无法访问地址。
运算符&
的地址只能用于变量。什么是变量?例如,a
中的int a;
将是一个变量,它将是一个包含整数值的变量。或b
中的int * b
也是一个变量,一个包含地址的变量,创建所有这些语言的人决定将其称为指针。 c
中int 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
*/
所以,我想说的是,在向它们添加和减去数字时,它们会有所不同,这就是他们所谓的指针算术。