c++指针数组似乎不符合逻辑

C++ pointer array seems not to be logical

本文关键字:不符合 指针 数组 c++      更新时间:2023-10-16

一个基本的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将总是给您相同的结果。