指向数组 C++ 的指针
pointer to array c++
下面的代码在做什么?
int g[] = {9,8};
int (*j) = g;
据我了解,它创建了一个指向 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];
在此链接中,有一个关于指针声明(以及如何摸索它们)的良好阅读:http://www.codeproject.com/Articles/7042/How-to-interpret-complex-C-C-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];
.
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错