关于int** a[3];的指针声明数量:是否声明了6个指针?
关于
int** a[3];的指针声明解析 首先直接给你明确结论:这个声明并没有创建6个指针,它实际是声明了一个包含3个元素的数组,每个元素都是int**类型(指向int*的指针)。下面一步步帮你理清楚逻辑:
1. 拆解声明的优先级逻辑
在C语言里,数组下标[]的优先级比指针解引用*更高,所以int** a[3];的解读顺序是:
- 首先,
a是一个大小为3的数组; - 数组的每个元素类型是
int**,也就是「指向int类型指针的指针」。
简单说,这个声明只在内存里创建了3个int**类型的指针变量,它们是数组的3个元素。
2. 你的访问假设哪里有问题
你提到可以通过*a[1]或**a[1]访问,这只是指针的层级解引用操作,并不代表声明里包含了6个指针:
a[1]:直接访问数组的第2个元素(下标从0开始),它本身就是一个int**指针;*a[1]:对这个int**指针解引用,得到它指向的int*类型指针——但这个int*指针并不是由int** a[3];声明创建的,需要你后续手动分配(比如用malloc)或者让它指向某个已有的int*变量;**a[1]:再对int*指针解引用,得到最终的int类型值——同样,这个int值的存储也不是声明自带的。
这些后续的指针或值都是需要你额外初始化的,原声明只负责创建数组里的3个int**指针。
总结
原声明仅创建了3个「指向int指针的指针」,不存在6个指针的说法。你提到的多层访问只是指针的解引用操作,对应的底层指针需要你后续手动定义或分配内存。
内容的提问来源于stack exchange,提问作者Daniele S DShot92
相关产品推荐
相关产品推荐

