arrP1是指针数组还是指向数组的指针?C语言技术疑问
搞懂
char* arrP1[] = { "father","mother",NULL };的本质 嘿,我来帮你把这个绕人的概念捋明白!你纠结的两个选项里,第一个才是对的——arrP1是一个指向静态字符串的指针数组,完全不是指向字符串数组的指针,我给你一步步拆解:
先拆解声明的含义
咱们把char* arrP1[]拆成两部分看:
char*:这是数组里每个元素的类型,意思是每个元素都是「指向char的指针」arrP1[]:这说明这是一个数组,数组的元素就是前面的char*类型。所以合起来,arrP1就是一个存储char指针的数组,也就是咱们说的「指针数组」。
为什么是指向静态字符串的指针数组?
你写的"father"、"mother"这些字符串字面量,在C程序里会被编译器放在静态内存区(程序启动就分配,退出才释放)。而arrP1的每个元素,就是存储了这些静态字符串首字符的地址:
- arrP1[0] = 指向"father"中第一个字符'f'的指针
- arrP1[1] = 指向"mother"中第一个字符'm'的指针
- arrP1[2] = NULL(空指针,用来标记数组结束)
你可以跑一段代码验证这个逻辑:
#include <stdio.h> int main() { char* arrP1[] = { "father","mother",NULL }; // 打印arrP1数组本身的地址 printf("arrP1数组的起始地址:%p\n", arrP1); // 打印arrP1[0]的值,也就是它指向的地址 printf("arrP1[0]指向的地址:%p\n", arrP1[0]); // 直接打印"father"的地址,会和上面的arrP1[0]完全一致 printf("\"father\"的首地址:%p\n", "father"); return 0; }
运行后你会发现,arrP1[0]的值和"father"的首地址完全相同,这就实锤了arrP1的元素确实是指向静态字符串的指针。
为什么不是「指向字符串数组的指针」?
指向数组的指针是完全不同的写法,比如如果要声明一个指向「长度为6的char数组」的指针,写法是char (*ptr)[6]——注意括号不能少,不然就变成指针数组了。这种指针的作用是指向一整个char数组,而不是装着一堆指针的数组,和你的arrP1根本不是一回事。
简单总结内存布局
- arrP1本身是一块连续的内存,大小等于「指针个数 × 单个指针的大小」(比如64位系统下每个指针8字节,3个元素就是24字节)
- arrP1的每个元素里存的是另一个地址,指向静态内存区里的字符串字面量
- 静态内存区里的"father"、"mother"是各自独立的字符串,每个末尾都有隐含的'\0'结尾
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

