c - 为什么对二维数组的间接应用会给出一个指针?
问题描述
在阅读了这个网站上的一些帖子后,我意识到 C 中的数组不仅仅是我最初认为的常量指针,而且它本身是一种独特的类型,但在大多数情况下,数组“衰减”为指向第一个元素的常量指针数组。由于这些新信息,我的脑海中出现了一个问题。假设我们有一个二维A[10][10]。为什么表达式 * A的结果是指向数组第一个元素的指针?我认为在这个表达式中,A衰减为指向数组A[0][0]的第一个元素的常量指针,然后间接的应用应该给我们A[0][0]的值,但实际上它仍然给了我们数组第一个元素的地址。当然,我的逻辑或我对数组或指针的理解有问题,那么我在哪里弄错了?
提前致谢。
解决方案
*A 或 A[0] 本身是一个包含 10 个元素的数组,并且数组始终由指向其第一个元素的指针表示。然而,A[10][10](假设是一个整数数组)实际上是一个内存块,可容纳 100 个整数,第一行的 10,然后是第二行的 10,依此类推。但是如果表达式 *A 或 A[0] 将返回一个 int 而不是一个 ptr 到该行,那么就不可能使用表达式 A[0][0],对吧?
然而,因为这样的多维数组是一个单一的内存块,也可以将它转换为一个指针,然后用这种表达式访问它:
((int *)A)[iRow * 10 + iCol];
这相当于表达式:
A[iRow][iCol];
但是,如果以这种方式声明的 2D 数组是可能的:
int main()
{
int A[10][10] = { 0 };
A[9][9] = 9999;
printf("==> %d\n", ((int *)A)[9 * 10 + 9]); //==> 9999
return 0;
}
如果内存可能由单独的字节块组成(可能需要多次调用 malloc),则不是这种表达式:
int * A[10]; // or
int ** A;
推荐阅读
- python - ModuleNotFoundError:即使安装了 matplotlib,也没有名为“matplotlib”的模块
- angular - Angular 8 路由错误未找到 NgModule 元数据
- excel - 如何在没有 Rubberduck TestModules 的情况下交付 Excel VBA 应用程序?
- css - 找不到调整“React Lazy Load Image Component”的css的方法
- java - 在 SpringBoot 中调度 JMS 监听器
- javascript - 无法为 Symfony Webpack 设置热模块重新加载 HMR
- angular - 使用 Jasmine 进行测试时如何模拟 MatChipInput
- sql - Oracle 从多个数据库表中查找字符串匹配
- groovy - 使用 Groovy 脚本对基于 64 位的 XML 值进行解码
- python - 在包中创建顶级函数