char指针指针

时间:2013-07-17 01:21:01

标签: c++ pointers char

我试图找到指针指针。我对此感到困惑

int syntax_error(int num) {
   cout << num << endl;
   static char *err[] = {
        "Cannot open\n",
        "I can open\n",
        "Sorry\n",
        "Thank you\n"
     };

    printf("%s", err[num]);

    cout<<"&err[num][1]"<<" "<<&err[num][1]<<endl;
    cout<<"&err[num]"<<" "<<&err[num]<<endl;
    cout<<"err[num][1]"<<" "<<err[num][1]<<endl;
    cout<<"*err[num]"<<" "<<*err[num]<<endl;

    return 0;
}

Say num = 3.然后生成以下输出

   Thank you
   &err[num][1] hank you
   &err[num] 0x8049ca4
   err[num][1] h
   *err[num] T

我读到&运算符引用它所引用的指针的地址。这里应该不返回err [num] [1]的地址,而不是从那里直到最后存储的地址。另一方面,&[num]正在返回地址。我在这里很困惑。如果有人能提供帮助,我们将不胜感激。

问题重新编辑:  &运营商应该参考地址。所以&err[num][1]应该返回一个地址。这里它给出了从err[3][1]开始的字符串。另一方面,&err[num]返回一个地址。那么为什么会混淆

2 个答案:

答案 0 :(得分:3)

[]不是独立运算符,定义如下:

a[b] == *(a + b)

如果您重写表达式,您将很快开始了解正在发生的事情:

&err[num][1] == &(*(*(err + num) + 1)) == *(err + num) + 1

这是指向特定字符串中第二个字符的char *指针。

&err[num] == &(*(err + num)) == err + num

这是指向外部数组的char **指针。

cout知道如何打印C字符串char*而不是char**指针,因此它只打印指针值。

注意:混合C和C ++ I / O通常是一个坏主意。

答案 1 :(得分:1)

当您将char *传递给op<<时,它会假定它是C风格的字符串并相应地执行操作。 C语言字符串中第二个字符的地址与第一个字符的地址没有区别,就其支持类型而言 - 它仍然是char *

如果您真的想要指针本身,请将其强制转换为void *,以便它不知道底层类型是什么。

例如:

#include <iostream>
int main (void) {
    const char *name = "=paxdiablo";
    std::cout << name << ' ' << (void*)name << '\n';
    std::cout << &name[1] << "  " << (void*)&(name[1]) << '\n';
    return 0;
}

输出:

=paxdiablo 0x8048880
paxdiablo  0x8048881