int main(){
int a[4] = { 1,2,3,4 };
int(*b)[4] = &a; //with a doesn't work
cout << a << &a << endl; //the same address is displayed
}
所以,
int(*b)[4]
是指向一个整数数组的指针。我尝试使用 &a
和 a
进行初始化,但只有第一个起作用。难道它们不都是数组的第一个元素的地址吗?从概念上来说,它们不是同一件事。即使它们指向相同的地址,它们是不兼容的指针类型,因此它们的用法也不同。
&a
取一个类型为 int [4]
的数组的地址,这意味着它是指向数组的指针 (即 int (*)[4]
)。
a
在这里引起了 数组到指针的退化,这意味着它是指向 int
的指针 (即 int*
)。
看一下这段代码
int a[4] = { 1, 2, 3, 4 } // array
int(*b) = a // pointer to the first element of the array
int(*b)
等同于int(*b)[0]
和a[0]
。因此,它是一个指向整数的指针(int*)
,而不是指向整数数组的指针。int(*b)[4] = &a;
它需要一个参数int(*ptr)[4]
。这意味着你必须严格传递该类型的参数,即int *
。
而你正在尝试将指向4个int
数组的指针传递给int *
。因此,在赋值中它们不兼容,即使它们的地址相同。
struct S { int x; } s;
。那么&s
和&s.x
是相同的数值地址。那么&s
是整个结构体对象的地址还是其第一个字段的地址呢? - AnT stands with Russia