为什么将数组的地址分配给指针"my_pointer = &my_array"是一个编译错误?
Why is it a compile error to assign the address of an array to a pointer "my_pointer = &my_array"?
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
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'