C ++指针数组似乎不合逻辑

时间:2014-08-14 05:05:28

标签: c++ pointers

基本的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'?
}

3 个答案:

答案 0 :(得分:1)

两次之后

a++;

a指向两个要素。现在新的a[0]实际上与之前的a[2]相同,因此打印holly

答案 1 :(得分:1)

预计两者输出相同(“冬青”)。

a[i]*(a + i)的简写,因此您的最后一行确实是*(a + 0)*a,这是之前执行的代码。

答案 2 :(得分:1)

它不会打印"john",因为传递给函数的数组会衰减为指针,当你修改a时(即当你执行a++时)你会丢失原始指针

另请注意,a[x]始终等同于*(a + x)(如果*a为零,则为x)。这意味着a[0]*a将始终为您提供相同的结果。