C++指向整数数组的指针

4
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] 是指向一个整数数组的指针。我尝试使用 &aa 进行初始化,但只有第一个起作用。难道它们不都是数组的第一个元素的地址吗?

你的意思是“初始化”,而不是“实例化”。 - M.M
指针有类型;(即它们是地址和类型)。这与“int x; double *p =&x;”不起作用的原因相同。 - M.M
@P. Danielski:如果数组的第一个元素的地址和整个数组的地址都从内存的同一点开始,你会如何区分它们?类似的例子是:struct S { int x; } s;。那么 &s&s.x 是相同的数值地址。那么 &s 是整个结构体对象的地址还是其第一个字段的地址呢? - AnT stands with Russia
可能是指向整数数组的指针的重复问题。 - ckruczek
“&a[0]”和“(char*)&a[0]”是一样的吗? - user253751
2个回答

6

从概念上来说,它们不是同一件事。即使它们指向相同的地址,它们是不兼容的指针类型,因此它们的用法也不同。

&a 取一个类型为 int [4] 的数组的地址,这意味着它是指向数组的指针 (即 int (*)[4])。

a 在这里引起了 数组到指针的退化,这意味着它是指向 int 的指针 (即 int*)。


0

看一下这段代码

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*),而不是指向整数数组的指针。
这就是你遇到类型问题的原因。
请注意,C语言是一种强类型语言。看看你的赋值语句。
int(*b)[4] = &a;

它需要一个参数int(*ptr)[4]。这意味着你必须严格传递该类型的参数,即int *

而你正在尝试将指向4个int数组的指针传递给int *。因此,在赋值中它们不兼容,即使它们的地址相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接