【发布时间】:2014-01-07 16:35:01
【问题描述】:
我一直在使用指针来帮助更好地理解。我已将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;
}
要通过指针a 访问b 的元素,我必须做a[0][0],就好像a 是一个数组数组一样。这与使用 new 关键字声明指向整数数组的指针相比,我可以在其中输出 c[0]。
int* c = new int[3] { 2, 4, 6 };
std::cout << c[0];
这是为什么?
非常感谢, 乔治
【问题讨论】:
-
啊,所以c指向的是数组的第一个元素(是整数),而不是数组的地址?我了解(在此示例中)该数组是内存中顺序的整数序列。数组本身是否有地址? (我假设数组的地址是它的第一个元素的内存地址)?
-
是的,数组有地址,和第一个元素的地址是一样的。但是指向数组的指针与指向
int(或其他)的指针的类型不同,因此您需要不同的语法来通过它访问数组元素。 -
帮自己一个忙:下次你想写类似
int (*a)[3];的东西时,离开键盘一会儿,重复“我在写 C++ 而不是 C,所以我不需要做那种丑陋的事情。”大约十几次,只有当你确信简单是好的时,才回来写你真正想要的东西(我很确定这会有所不同)。 -
第一个元素的地址和数组相同。
c是指向int的指针,因为它是这样说的:int* c,与初始化的 RHS 上的内容无关。new返回指向数组(或第一个元素)的指针,并且在许多情况下,数组本身衰减 为指向其第一个元素的指针。幸运的是,您不必在现代 C++ 中处理这类事情。 -
查看cdecl.org 是否可以在您的手机上运行 :)
标签: c++ arrays pointers iostream