[英]pointer to array c++
以下代码在做什么?
int g[] = {9,8};
int (*j) = g;
从我的理解,它创建一个指向2个int数组的指针。 但是为什么这会起作用:
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];
这里有一个很好的读指针声明(以及如何理解它们): http : //www.codeproject.com/Articles/7042/How-to-interpret-complex-CC-declarations
int g[] = {9,8};
这声明了一个int [2]类型的对象,并将其元素初始化为{9,8}
int (*j) = g;
这声明了一个int *类型的对象,并使用指向g的第一个元素的指针对其进行初始化。
第二个声明用g以外的东西初始化j的事实很奇怪。 C和C ++只是有关于数组的这些奇怪的规则,这就是其中之一。 这里,表达式g
被隐式地从引用对象g的左值转换为指向g的第一个元素的类型int*
的右值。
这种转换发生在几个地方。 事实上,当你执行g[0]
时会发生这种情况。 数组索引运算符实际上不在数组上,只在指针上工作。 所以语句int x = j[0];
之所以有效,是因为g[0]
碰巧执行了j
初始化时所做的相同的隐式转换。
指向数组的指针就像这样声明
int (*k)[2];
而且你对如何使用它是完全正确的
int x = (*k)[0];
(注意“声明跟随使用” ,即声明类型变量的语法模仿使用该类型变量的语法。)
但是,通常不使用指向数组的指针。 围绕数组的特殊规则的全部目的是,您可以使用指向数组元素的指针,就像它是一个数组一样。 因此,惯用的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 ++中的其他类型非常不一致,所以应该避免使用它们。 C ++的std::array
更加一致,你需要在需要静态大小的数组时使用它。 如果你需要动态大小的数组,你的第一个选项是std :: vector。
j[0];
取消引用指向int
的指针,因此其类型为int
。
(*j)[0]
没有类型。 *j
取消引用指向int
的指针,因此它返回一个int
,而(*j)[0]
尝试取消引用int
。 这就像尝试int x = 8; x[0];
int x = 8; x[0];
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.