int类型数组能否存储字符,char类型数组能否存储整数值?
C语言int数组存储字符、char数组存储整数的底层原理
你给出的示例代码运行后会输出49491111,该现象的核心逻辑可以拆解为三点:
char本质是1字节整数类型
C语言中没有独立的「字符」存储逻辑,所有字符都是以对应ASCII码的整数值存储的,'1'、'a'这类字符字面量本身的类型就是int,对应值分别是十进制的49、97,直接赋值给int数组元素和存储普通整数没有任何差异。- 合法范围的整数可以跨小整数类型赋值
只要赋值的数值在目标类型的取值范围内,操作就是完全合法的:- int的取值范围远大于ASCII码的0~127区间,存储字符不会发生溢出
- 11、21这类小整数也在char的常规取值范围内(无符号char为0255,有符号char通常为-128127),存入char数组不会出错
- printf的整型提升规则匹配输出逻辑
使用%d格式符输出时,传入的char类型参数会自动做整型提升,转为int类型后再被printf读取,所以会直接输出存储的整数值,符合运行预期。
注意:如果给char类型赋值超出其取值范围的整数,会发生数值截断,有符号char场景下属于未定义行为,日常开发需要避免这类操作。
附示例代码注解:
int main(void) { int arri[] = {'1' , '2', 'a'}; int *ptri = arri; char arrc[] = {11, 21 , 31 }; char *ptrc = arrc; printf("%d" , *arri); // 输出'1'对应的ASCII码49 printf("%d" , *ptri); // 指针指向首元素,和上面等价,输出49 printf("%d" , *arrc ); // 输出char数组存储的整数值11 printf("%d" , *ptrc); // 指针指向首元素,和上面等价,输出11 return 0; }
内容的提问来源于stack exchange,提问作者twinkletwinklelittlestar
相关产品推荐
相关产品推荐

