【问题标题】:char pointer to pointerchar 指向指针的指针
【发布时间】:2013-07-17 01:21:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请重新提出您的问题!
  • 其实当num为2时,printf("%s", err[num]);会打印Sorry而不是Thank you
  • @AnnieKim 对不起。我的意思是 num = 3

标签: c++ pointers char


【解决方案1】:

[]不是一个独立的算子,它的定义如下:

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

如果你重写表达式,你会很快开始理解发生了什么:

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

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

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

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

cout 知道如何打印 C 字符串 char* 但不知道 char** 指针,所以它只打印指针值。

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

【讨论】:

  • 非常感谢。只是一个问题。那么如何输出指向外部数组的char ** 指针呢?
  • @Vaidyanathan 好吧,这取决于您要输出的内容。打印char ** 指针没有合理的语义。
【解决方案2】:

当您将char * 传递给op&lt;&lt; 时,它假定它是一个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

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 2021-11-26
    • 2017-09-03
    • 2016-01-27
    • 2011-04-24
    • 1970-01-01
    • 2021-01-26
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多