C语言arr[str[i]]++实现字符计数原理及循环中内存运行机制疑问
arr[str[i]]++ 统计逻辑说明
这行代码的核心是利用了C语言中char类型的整数本质:
- 每个字符默认对应0~255范围内的ASCII编码值,刚好和你定义的长度为256的
arr数组下标范围完全匹配 - 数组
arr初始化全为0,相当于每个ASCII字符的初始计数都为0 - 代码前置的
if判断排除了空格和逗号,只有其他字符会进入计数逻辑
执行统计时逻辑非常直接:
- 取当前遍历到的字符
str[i],直接用它的ASCII编码值作为数组下标,比如小写t的ASCII值是116,就对应arr[116],大写T的ASCII值是84,对应arr[84] - 对该下标的数组元素做自增操作,等同于该字符的出现次数+1
你给出的测试字符串里有3组小写test和3组大写TEST,刚好对应输出里小写t出现6次、e出现3次、s出现3次,大写T出现6次、E出现3次、S出现3次的结果,大小写分开统计是因为二者ASCII值不同,对应数组不同下标的计数器。
执行时的内存操作细节
每次运行arr[str[i]]++时,内存层面会依次执行三个动作:
- 首先读取
str[i]对应内存地址存储的1字节字符值,转换为int类型的ASCII编码值 - 以
arr数组的首地址为基准,偏移「ASCII值 × int类型占用字节数」的长度,定位到对应数组元素的内存地址 - 读取该地址存储的当前计数数值,加1后重新写回该内存地址
内容的提问来源于stack exchange,提问作者vbat
相关产品推荐
相关产品推荐

