C语言中char str[10]、char *str、char *str[10]的关系及用法问题
C语言三类char相关声明的差异、关联与使用说明
三者的核心定义与关联
三个声明都和字符/字符串处理相关,但底层内存结构完全不同:
char str[10]:在栈上分配的固定长度连续字符数组,总占10字节空间,最多存储长度为9的字符串(预留1字节存字符串结束符\0)。数组名str是指向首元素的常量地址,不能被重新赋值指向其他内存位置。char *str:字符类型指针,本身仅占1个指针长度的内存(32位环境4字节、64位环境8字节),不直接存储字符串内容,仅保存某块字符内存的首地址,可以被随意赋值指向栈数组、堆内存、只读段字符串常量等任意合法字符内存位置。char *str[10]:长度固定为10的字符指针数组,本质是数组,连续存储10个char*类型的指针,每个指针可以独立指向不同位置、不同长度的字符串。
char *str[10]能否等价为二维数组?
不能直接视为二维数组,仅在特定内存分配场景下访问语法相似,核心结构差异极大:
真正的二维字符数组(比如
char str[10][10])是整块连续的内存空间,总大小固定为行*列字节,每一行的长度完全一致,行与行内存紧密相邻。
char *str[10]仅自身的指针数组存储空间是连续的,每个指针指向的字符串内存可以完全不连续,且每个指针指向的字符串长度没有限制,可以长短不一,甚至可以让部分指针赋值为NULL不指向任何有效字符串,和固定列宽的二维数组本质完全不同。
初始化char *str[10]={"ONE","TWO","THREE"}后的单字符访问方法
该初始化逻辑下,数组前3个元素分别指向只读数据段存储的3个字符串常量首地址,剩余7个元素默认初始化为NULL。
访问单个字符直接使用双层下标即可,格式为str[字符串序号][字符在字符串内的偏移],序号和偏移都从0开始计数:
- 要取第一个字符串"ONE"中的'N',对应写法为
str[0][1]:第一层下标取到第一个字符串的首指针,第二层下标取指针偏移1位置的字符 - 要取第三个字符串"THREE"中的'R',对应写法为
str[2][2]
注意:这几个字符串都存储在只读内存段,不要尝试通过下标修改对应位置的字符,否则会触发内存访问错误,属于未定义行为。
内容的提问来源于stack exchange,提问作者Karna Rai
相关产品推荐
相关产品推荐

