c++指针数组似乎不符合逻辑
C++ pointer array seems not to be logical
一个基本的c++字符串/指针问题。问题包含在最后的注释中——即为什么最后一行的[0]不产生'john'?
#include <iostream>
using namespace std;
void funk(char* a[]);
int main() {
char* z[5];
z[0] = "john";
z[1] = "susan";
z[2] = "holly";
z[3] = "simon";
z[4] = "lucinda";
funk(z);
cin.get();
return 0;
}
void funk(char* a[]) {
cout << a[0] << endl; // prints 'john'.
cout << *a << endl; // prints 'john'.
a++;
cout << *a << endl; // prints 'susan'.
a++;
cout << *a << endl; // prints 'holly'.
cout << a[0] << endl; // prints 'holly' again. But why?! Why doesn't it print 'john'?
}
后面两个
a++;
a
指向两个向前的元素。现在新的a[0]
实际上与之前的a[2]
相同,因此打印holly
。
两者输出相同("holly")
a[i]
是*(a + i)
的简写,所以你的最后一行实际上是*(a + 0)
,或者*a
,这是之前执行的代码。
它不打印"john"
,因为数组传递给函数时会衰减为指针,当您修改a
(即当您执行a++
时)时,您会丢失原始指针。
还要注意,a[x]
总是等同于*(a + x)
(如果x
为零,则等于*a
)。这意味着a[0]
和*a
将总是给您相同的结果。
相关文章:
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 在函数中返回无符号字符数组,但不返回指针
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 将 QByteArray 转换为无符号短:不符合预期
- 为什么此模板函数的行为不符合预期?
- 为什么 std::basic_ostream::运算符<<不符合 CONST 资格?
- 对于指向C++类的不透明C指针,正确的typedef是什么
- std::vector 构造initializer_list的行为不符合预期
- 创建不带指针的可变大小数组
- 处理 pybind11 中的不透明指针
- 为什么使用指向函数的指针调用虚函数时不需要指针"this"?
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- C++使用 LZ4 进行压缩,压缩信息不符合预期
- 为什么 std::future::wait_for 的行为不符合预期?
- 更改类 | 中的结构或类,带或不带指针
- 我该如何允许类型的对象非专业化并在不使用指针的情况下识别何时是这种情况
- 使用sectType声明整个函数类型本身(不是指针!)
- 当 ParamType 既不是指针也不是引用时自动类型推断
- 对指针行为不符合预期行为的 const 引用
- c++指针数组似乎不符合逻辑