我一直在玩指针以帮助我们更好地理解。我已将a
声明为长度为3的整数数组和b
的整数数组,作为长度为3的整数数组。然后我将a
指向b
。
int main()
{
int (*a)[3];
int b[3] { 2, 4, 6 };
a = &b;
a[0][0] = 8;
// This prints out 8 and 8.
std::cout << a[0][0] << "\t" << b[0];
// This prints out 0x28fecc and 8.
std::cout << a[0] << "\t" << b[0];
return 0;
}
要通过指针b
访问a
的元素,我必须执行a[0][0]
,就像a是一个数组数组一样。这与使用new关键字声明指向整数数组的指针进行比较,我只能输出c[0]
。
int* c = new int[3] { 2, 4, 6 };
std::cout << c[0];
为什么会这样?
非常感谢, 乔治
答案 0 :(得分:4)
我必须做
a[0][0]
,好像a是一个数组数组。
实际上,a
是指向数组的指针,因此数组本身为*a
,数组的第一个元素为(*a)[0]
或等效a[0][0]
}。
您可能希望a
成为指向数组第一个元素的指针(就像c
是指向动态数组的第一个元素的指针一样):
int * a = b;
现在a[i]
将是数组的元素i
。
答案 1 :(得分:1)
a
是指向单个数组的指针,所以你真的应该(*a)[0]
。当你执行a[0]
时,这与*a
相同,所以你得到了数组,它在输出中衰减为指针,这就是你看到打印地址的原因。
c
是一个指向整数的指针,并且已知指向数组的第一个元素,因此简单的数组符号可以工作。
答案 2 :(得分:1)
a
的正常声明将是
int *a;
然后你可以使用
a = b;
std::cout << a[0];
将打印
8
答案 3 :(得分:0)
这是因为你定义了另一种类型。再考虑一下声明
int* c = new int[3] { 2, 4, 6 };
在左侧使用int * c。所以你可以为你的本地数组编写相同的文件
int *a;
int b[3] { 2, 4, 6 };
a = b;
在这种情况下,您只需使用一个下标来访问数组的每个元素:
a[0] = 8;
在此表达式声明中
a = b;
数组b被隐式转换为指向其第一个元素的指针,即右侧的子表达式b具有类型int *
答案 4 :(得分:0)
宣言反映了使用。
b
被声明为int b[3]
;您访问({1}}的第一个元素。
b[0]
被声明为a
;等效访问权限为int (*a)[3]
。
如果你打破了#34;等效访问&#34;,你可以看到它有两个操作。首先,它使用解引用运算符&#34;一元星&#34; - (*a)[0]
。记住,它本身就是一个指针。取消引用返回指向的值。因此,*a
之后,a = &b
。
那么*a == b
的交易是什么?好吧,数组访问运算符a[0][0]
实际上适用于通用指针(并且,为了使事情变得更奇怪,数组&#34;衰减&#34;指针)。 []
在C中定义为与a[N]
完全相同;所以*(a + N)
是我们已经讨论过的a[0]
。基本上,在此上下文中使用*a
而不是a[0][0]
使用基于运算符(*a)[0]
定义的双关语来隐藏该声明应反映使用。