【发布时间】:2011-10-21 01:14:15
【问题描述】:
似乎间接运算符的常规定义在用于多维数组时不适用:
int arr[10][10][10];
如果你取消引用 arr,你会得到相同的地址:
(void*)arr == (void*)*arr && (void*)*arr == (void*)**arr
这是有道理的——多维数组只是一个连续的内存区域,指针指向内存的开头。编译器基本上忽略了取消引用,只是计算了正确的偏移量。使用间接运算符似乎只保留了多维数组的抽象,并使其与语言的其他句法结构相匹配。
如果您执行以下操作:
int *** ptr = (int***) arr;
然后取消引用 ptr,您将看到正常的取消引用行为,其中返回指针指定位置的值。使用上面的转换,如果你取消引用指针两次以上,你将读入未定义的内存。
我只是想知道为什么没有在更多地方记录这种行为 - 也就是说,间接运算符对指向数组的指针与指向指针的指针和指向值的指针的效果差异?
【问题讨论】:
-
数组不是指针,尽管在某些情况下数组会转换为指针stackoverflow.com/questions/7844049。但是,数组永远不会变成高阶指针。这是数组->指针衰减规则的结果。 Array->pointer decay 是 C 语言中的一种,如果你知道发生了什么就很方便,如果你不知道,那就完全是巫术。
标签: c++ c pointers multidimensional-array