如果您声明了一个数组,例如:
T a[N];
当T
为某个类型说明符时,指向数组的指针将声明为如下:
T ( *p )[N] = &a;
一个通用的规则是:如果你有一个多维数组(包括一维数组),例如:
T a[N1][N2][N3];
那么你可以将这个声明重写为:
T ( a[N1] )[N2][N3];
要获取数组的第一个元素的指针,只需按以下方式替换括号中的内容。
T ( *p )[N2][N3] = a;
如果您想获得整个数组的指针,那么请重新编写数组声明,例如:
T ( a )[N1][N2][N3];
并进行替换
T ( *p )[N1][N2][N3] = &a;
与标量对象及其指针的声明相比较。
例如:
T obj;
您可以将声明重写为:
T ( obj );
现在,如果您想获取一个指向对象的指针,可以编写
T ( *p ) = &obj;
当然,在这种情况下括号是多余的,上述声明等价于:
T *p = &obj;
关于这段代码片段
int q[10]={0};
cout << q << endl;
cout << &q << endl;
cout << &q[0] << endl;
以及它的输出
0x7fffd4d2f860
0x7fffd4d2f860
0x7fffd4d2f860
很少有例外情况下,用于表达式中的数组设计器会被转换为指向其第一个元素的指针。
因此,实际上在这些语句中,表达式q
和&q[0]
是相同的。
cout << q << endl;
cout << &q[0] << endl;
是等效的。然而,数组本身的地址是其占用的内存范围的地址。在范围的开头是数组的第一个元素。所以这三个表达式都给出了同样的结果:数组占用的内存范围的地址。
int **
。 - ALX23zstd::ostream
定义了一个operator<<(void*)
,而void*
可以接受任何类型的指针(几乎是所有类型)。你所使用的三个<<
调用都解析到同一个内存地址,这就是它们都打印出相同数字的原因。 - Remy Lebeaucout
打印的是值。cout
不会告诉您一个表达式是否是可分配的有效类型。 - Drew Dormannerror: cannot convert 'int (*)[10]' to 'int*' in initialization
从中很容易看出类型是错误的。好的编译器消息就像黄金一样珍贵。 - user4581301