为什么将数组的地址分配给指针"my_pointer = &my_array"是一个编译错误?

Why is it a compile error to assign the address of an array to a pointer "my_pointer = &my_array"?

本文关键字:my 错误 编译 一个 array pointer 地址 数组 分配 为什么 指针      更新时间:2023-10-16
int my_array[5] = {0};
int *my_pointer = 0;
my_pointer = &my_array;  // compiler error
my_pointer = my_array;   // ok

如果my_array数组的地址,那么&my_array给了我什么?

我收到以下编译器错误:

错误:无法在赋值中将"int (*)[5]"转换为"int*"

>my_array 是一个由 5 个整数组成的数组的名称。编译器会很乐意将其转换为指向单个整数的指针。

&my_array 是指向 5 个整数数组的指针。编译器不会将整数数组视为单个整数,因此它拒绝进行转换。

&my_array是存储my_array值的地址,即它是数组地址的地址,类型为int**

对于神经科学、语义学和软件开发的研究来说,这将是一个引人入胜的话题。尽管我们可以解释 my_array 和 &my_array 之间的区别,即使我们可以重复"数组是(或不是)指针"的口头禅,这种区别仍然令人困惑。

通常,当我们使用"&"操作获取某物的地址时,我们会得到一个完全不同的值。

int x;
x=5;
cout <<x << " "<<&x<<endl;

首先,让我们挑战这种直觉。指针可能会意外等于它指向的值:

int* x;
x=(int*)(&x);
cout <<"same: "<<x << " "<<&x<<endl;

因此,在某些情况下,语义上不同的事物可以评估为同一件事。但是,仅仅因为两个表达式在当前上下文中相等并不意味着它们是可以互换的。

int w=3;
int* ip=&w;
void* vp=&w;
cout <<"Equal: "<<ip<<" "<<vp<<" "<<(ip==vp)<<endl;
cout <<"But not interchangeable: "<<ip+1<<" "<<vp+1<<" "<<(ip+1==vp+1)<<endl;

指向数组的指针也会发生同样的情况。指向数组的指针在技术上通常与数组本身"相同",但由于它们具有不同的语义,因此在某些情况下它们不可互换。试试这个:

int my_array[5] = {5,6,7,8,9};
cout <<my_array[0]<<endl;    // output 5
cout <<(&my_array)[0]<<endl; // outputs the address of the first element
cout <<sizeof my_array[0]<<endl; // outputs 4
cout <<sizeof (&my_array)[0]<<endl; // outputs 20