指向数组c ++的指针
以下代码在做什么?
int g[] = {9,8}; int (*j) = g;
从我的理解中创build一个指向2个整数的指针。 但是为什么这个工作:
int x = j[0];
这不工作:
int x = (*j)[0];
在你的例子中括号是多余的。 指针并不关心是否有数组参与 – 它只知道它指向一个int
int g[] = {9,8}; int (*j) = g;
也可以改写为
int g[] = {9,8}; int *j = g;
也可以重写为
int g[] = {9,8}; int *j = &g[0];
一个数组指针看起来像
int g[] = {9,8}; int (*j)[2] = &g; //Dereference 'j' and access array element zero int n = (*j)[0];
有一个很好的阅读指针声明(以及如何grook)在这里的链接: http : //www.codeproject.com/Articles/7042/How-to-interpret-complex-CC-declarations
int g[] = {9,8};
这声明了一个int [2]types的对象,并将其元素初始化为{9,8}
int (*j) = g;
这声明了一个int *types的对象,并用一个指向g的第一个元素的指针初始化它。
第二个声明用g以外的东西初始化j的事实是很奇怪的。 C和C ++只是有关于数组的这些奇怪的规则,这就是其中之一。 这里,expression式g
从引用对象g的左值隐式地转换成指向g的第一个元素的types为int*
的右值。
这种转换发生在几个地方。 事实上,它发生在你做g[0]
。 数组索引操作符实际上不能在数组上工作,只能在指针上工作。 所以语句int x = j[0];
因为g[0]
恰巧做了j
初始化时完成的同样的隐式转换。
指向数组的指针是这样声明的
int (*k)[2];
你完全正确的如何使用它
int x = (*k)[0];
(请注意“声明如何使用” ,即声明typesvariables的语法模仿使用该typesvariables的语法。)
但是通常不使用指向数组的指针。 围绕数组的特殊规则的全部目的是让你可以像数组一样使用指向数组元素的指针。 所以惯用的C通常不关心数组和指针是不是相同的东西,规则阻止你做任何有用的东西直接与数组。 (例如,你不能复制一个数组,例如: int g[2] = {1,2}; int h[2]; h = g;
)
例子:
void foo(int c[10]); // looks like we're taking an array by value. // Wrong, the parameter type is 'adjusted' to be int* int bar[3] = {1,2}; foo(bar); // compile error due to wrong types (int[3] vs. int[10])? // No, compiles fine but you'll probably get undefined behavior at runtime // if you want type checking, you can pass arrays by reference (or just use std::array): void foo2(int (&c)[10]); // paramater type isn't 'adjusted' foo2(bar); // compiler error, cannot convert int[3] to int (&)[10] int baz()[10]; // returning an array by value? // No, return types are prohibited from being an array. int g[2] = {1,2}; int h[2] = g; // initializing the array? No, initializing an array requires {} syntax h = g; // copying an array? No, assigning to arrays is prohibited
因为数组与C和C ++中的其他types非常不一致,所以应该避免使用它们。 C ++有更稳定的std::array
,当你需要静态大小的数组时,你应该使用它。 如果你需要dynamic大小的数组,你的第一个select是std :: vector。
j[0];
取消引用int
的指针,所以它的types是int
。
(*j)[0]
没有types。 *j
解引用一个int
指针,所以它返回一个int
,并且(*j)[0]
试图解引用一个int
。 这就像试图int x = 8; x[0];
int x = 8; x[0];
。