char数组和ASCII码的理解

一.问题 

#include 
int main()
{
	char arr[] = { 73,32,99,97,110,32,100,111,32,105,116,33 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//求数组元素个数
	//sizeof(arr) - 计算的是数组的总大小,单位是字节
	//sizeof(arr[0]) - 计算的是数组元素的大小
	while (i < sz)
	{
		printf("%c", arr[i]);
		i++;
	}

	return 0;
}

char arr[] = { 73,32,99,97,110,32,100,111,32,105,116,33 }; 数组里面的元素是否每个元素都是字符类型?

那么我以printf("%c", arr[i]);打印的时候,为什么打印出来的是ASCII码对应的字符,而不是我存进数组的字符????

二.思考

在deepseek的帮助下,我了解了这个问题。

数组arr被声明为char[],所以每个元素的类型是char。不过初始化的时候用的是整数,比如73、32等等。在C语言中,char类型其实就是整数类型,只不过通常用来表示字符的ASCII码值。所以当我把73存进去的时候,实际上存储的是这个整数对应的char类型值,也就是ASCII码中的字符'I'因为73对应的ASCII字符是大写的I。

我以为他们存进去的是字符本身,但这里我直接用了整数,所以数组中的每个元素实际上存储的是这些整数对应的ASCII码的字符。因此,当用%c打印时,自然就会显示这些ASCII码对应的字符,而不是原来的整数。

三.解答

在C语言中,char类型本质上是1字节的整数,用于存储字符的ASCII码值。当你声明数组char arr[]并用整数初始化时(如7332等),数组中的每个元素存储的实际上是这些整数对应的ASCII字符编码值。printf("%c", arr[i])的作用是将存储的ASCII码值转换为对应的字符输出,而非直接输出原始整数。

关键点解析:

  1. 存储本质

    • char类型存储的是ASCII码的整数值,而非字符的字面形式。

    • 例如,73的ASCII码对应字符'I'32对应空格,99对应'c'

  2. 输入与输出的映射

    • 当你用整数初始化char数组时(如73),编译器会将其视为ASCII码值。

    • 使用%c格式符时,printf会将ASCII码值解码为字符(如73 → 'I')。

    • 若想输出原始整数,应使用%d格式符:printf("%d", arr[i])

四.补充 

倘若我就想直接把字符存入数组:

	char arr[] = { '1',32,99,97,110,32,100,111,32,105,116,33 };

这样再按照第一张图打印,就会打印出我们所存储的1。

你可能感兴趣的:(算法,数据结构,c语言,学习)