c++ - 数组和指针 C++

标签 c++ arrays pointers

为什么指针变量可以赋值而数组变量不能? 换句话说,为什么语句 4 在代码段下面是非法的?

1.int a[10];
2.int *p; 
3.p=a;     //legal operation
4.a=p;    // Illegal operation

最佳答案

你的陈述 3. 被称为衰变是有原因的。转换是一种方式,因为指针和数组是不一样的。

当数组衰减为指针时,它会丢失有关其大小的信息。它无法重新获得,因此无法隐式执行相反的转换。 IE。到 int[WHAT] 它应该转换回来吗?

我脑海中的两个主要区别:

  1. 如果您检查 a 是否包含有关其大小的信息,则指针不包含。检查 sizeof(a)sizeof(p)sizeof(*p)

  2. 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/

相关文章:

c++ - 如何检查指针后面的对象是否有效或已被删除?

c - 如何通过使用函数在该程序中使用模块化

c++ - C++ 中有趣的位掩码拼图

c++ - 从 Visual Studio 2005 移植到 2008 或更高版本

c++ - 为什么 "using namespace std;"被认为是不好的做法?

arrays - 如何在 4 X 4 数组 ruby 中赋值?

C++ 越界读/写数组

javascript - 将php关联数组转换为javascript对象

javascript - JSON 不会在 MVC 4 中发布包含 1 个项目的数组

arrays - 用指向 C 中结构的指针填充二维指针数组