2

我试图绕过指向指针的指针。我对此感到困惑

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;
}

说 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]返回一个地址。那么为什么这会混淆

4

2 回答 2

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 通常是个坏主意。

于 2013-07-17T01:30:59.347 回答
1

当您将 a 传递char *给 时op<<,它假定它是 C 风格的字符串并采取相应的行动。C 风格字符串中第二个字符的地址与第一个字符的地址没有什么不同,就其支持类型而言 - 它仍然是char *.

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

例如:

#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
于 2013-07-17T01:25:08.950 回答