我试图找到指针指针。我对此感到困惑
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]
返回一个地址。那么为什么会混淆
答案 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