2017-07-20 216 views
3
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]是一个指向int数组的指针。我试图用&aa来初始化它。它只适用于第一个。
它们不都是数组第一个元素的地址吗?
C++指向int数组的指针

+0

你的意思是“初始化”,而不是“实例化” –

+0

指针有一个类型; (即它们是地址和类型)。这不起作用的原因是'int x; double * p =&x;'不起作用。 –

+0

@P。 Danielski:如果两者都是从内存中的相同位置开始的,你将如何区分“阵列的第一个元素的地址”和“整个阵列的地址”?一个类似的例子:struct S {int x; } s;'。然后'&s'和'&s.x'是相同的数字地址。那么,那么'&s'是什么:整个结构对象的地址或它的第一个字段的地址? – AnT

回答

6

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

&a正在采用类型为int [4]的数组的地址),那么它意味着指向数组的指针(即int (*)[4])。

a这里引起array-to-pointer decay,那么它意味着指向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 intint *。因此,他们在作业中不兼容,即使他们的地址也是一样的。