为什么指针变量可以赋值而数组变量不能? 换句话说,为什么语句 4 在代码段下面是非法的?
1.int a[10];
2.int *p;
3.p=a; //legal operation
4.a=p; // Illegal operation
最佳答案
你的陈述 3. 被称为衰变是有原因的。转换是一种方式,因为指针和数组是不一样的。
当数组衰减为指针时,它会丢失有关其大小的信息。它无法重新获得,因此无法隐式执行相反的转换。 IE。到 int[WHAT]
它应该转换回来吗?
我脑海中的两个主要区别:
如果您检查
a
是否包含有关其大小的信息,则指针不包含。检查sizeof(a)
、sizeof(p)
和sizeof(*p)
。a
保证存在一些元素(c++ 禁止零大小数组)。
但在某些情况下,将p
视为类型decltype(p)
的未绑定(bind) 数组是有意义的。特别是元素的放置很容易计算给定元素在内存中的放置。它与指针运算相同。这就是为什么符号是相同的,例如p[6]
和 a[6]
都有效。因此接受数组的函数可以接受任意大小的数组。
但不一样。
当您添加另一个维度时,差异就会变得明显。使用(固定大小)数组,您可以像上面那样计算元素的位置,它在内存中是连续的,并且您知道每个“行”的大小。
但是对于int**
,您有两个不知道边界的级别。 IE。您无法算术计算元素在 int**
中的位置,您必须解析第 1 级,然后使用计算。每个“行”可以有不同的长度。
这就是为什么您会收到如下所示的错误:
main.cpp:11:8: error: cannot convert 'int**' to 'int ()[5]' for argument '1' to 'void f(int ()[5])'
请注意,第一维已转换为指针,但您只能在一维上取消绑定(bind)数组(按照惯例,它是第一维)!
参见 http://coliru.stacked-crooked.com/a/5063a9d19739278a :
void f(int a[3][5]){}
int main() {
int ** p = new int*;
int b[4][5]; // works because 1st dimension can decay to pointer (unbound array)
int c[3][6]; // doesn't work because 2st dimension cannot decay to pointer
f(p); f(b); f(c);
return 0;
}
关于c++ - 数组和指针 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42458968/