我正在学习指针并挑战自己,我尝试取消引用指向字符数组的指针.最终这有效:
char (*p)[sizeof(c)];
其中c是数组c [] =“something”
我很难理解(* p)[sizeof(c)];不同于* p [sizeof(c)];
基于我目前所知的(这并不多!)计算机在(* p)[sizeof(c)]的情况下这样说:
“p指向c!哦,顺便说一句,p是任何大小的数组(c)最终都是”.
但即使这对我来说也很奇怪,所以我想我在添加括号时会对构造的内容感到困惑.
谁能解释一下?
完整代码在上下文中:
#include <iostream> using namespace std; int main(int argc,char *argv[]) { char c[] = "something"; char (*p)[sizeof(c)]; // this works // char *p[sizeof(c)]; // this doesn't? p = &c; cout << p << endl; cout << *p << endl; }
解决方法
可以使用非正式称为左右规则的内容来读取C中的类型.您从声明的变量的名称开始,然后在您可以的情况下向右移动,然后在您可以的情况下向左移动,然后重新开始.圆括号会阻止您,直到考虑了所有内容为止.
在你的例子中:
char (*p)[sizeof(c)]; ^ p... (hit ')',turn around) ^ is a pointer... (hit '(',turn around and remove '()') ^^^^^^^^^^^ to an array of `sizeof(c)`... (end of line,turn around) ^^^^ chars. nothing left,we're done!
没有括号,这变为:
char *p[sizeof(c)]; ^^^^^^^^^^^^ p is an array of `sizeof(c)`... (end of line,turn around) ^^^^^^ pointers to char.
这确实是完全不同的.