字符串,字符数组的初始化

先上代码:

#include

int main()
{
	char* s1 = (char *)"aaaaa";
	//	char * s2={'b','b','b','b','b'};//[Error] scalar object 's2' requires one element in initializer
	char s3[] = "ccccc";
	//	char s4[5]="ddddd";//[Error] initializer-string for array of chars is too long [-fpermissive]
	char s4[5] = "dddd";
	char s5[] = { 'e','e','e','e','e' };
	char s6[5] = { 'f','f','f','f','f' };

	printf("%s\n", s1);
	printf("%s\n", s3);
	printf("%s\n", s4);
	printf("%s\n", s5);
	printf("%s\n", s6);

	for (int i = 0;i < sizeof(s1) + 1;i++)//此处sizeof(s1)=4,因为s1是char * 类型,size恒为4。故不能打印出整个字符串。
		printf("%d.%c\t", i, s1[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s3) + 1;i++)
		printf("%d.%c\t", i, s3[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s4) + 1;i++)
		printf("%d.%c\t", i, s4[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s5) + 1;i++)
		printf("%d.%c\t", i, s5[i]);
	printf("\n");
	for (int i = 0;i < sizeof(s6) + 1;i++)
		printf("%d.%c\t", i, s6[i]);

}

其中char* s1 = (char *)“aaaaa”;在有些编译器中不强制转化只会warning不会报错。

输出五个字符串如下:
字符串,字符数组的初始化_第1张图片

调试过程中:
字符串,字符数组的初始化_第2张图片

s1在内存中:
字符串,字符数组的初始化_第3张图片

"aaaaa"是字符串常量,被分配在静态区(可以看到s1内存地址与s3,s4,s5,s6都不太相同),强制类型转化后赋值给s1。

s3在内存中:
字符串,字符数组的初始化_第4张图片

s3实际长度为6,末尾自动添加上了’\0’。

s4在内存中:
字符串,字符数组的初始化_第5张图片

s5在内存中:
字符串,字符数组的初始化_第6张图片
s6在内存中:
S6
可以看到:五个字符串中,后两个字符串输出异常,对应其在内存中的情况不难发现后两个字符串在内存中结尾并没有’\0’,即0x00。因而无法识别其结尾而打印出无效内容。

五个字符串按字符打印效果(打印长度比字符串长度多1)
字符串,字符数组的初始化_第7张图片

s1实际长度为6;
另外以字符形式赋值给s5,s6字符串,末尾并没有自动添加上’\0’。

二维字符数组、二维字符串数组初始化

	char s7[][4] = { "aaa","bbb","ccc","ddd" };
	//由于数组第二维为4,去掉默认在字符串尾部添加的'\0'字符,赋值时每个字符串长度不能超过4-1。长度小于3时,空余部分填充的好像都是'\0'。
	char s8[][4]={'a','a','a','\0','b','b','b','\0','c','c','c','\0','d','d','d','\0'};
	//以字符形式为数组赋值时,每行最后元素需要人为添加'\0',否则无法以字符串形式打印出某一行。
	char *s9[3]={"aaaaa","bbbb","ccc"};
	//含有3个元素的指针数组:每个数组元素是一个指向字符串常量的指针(该字符串常量长度任意)。
	char *s10[3][3]={{"asdx","qwer","fdsfaf"},{"44444","555","6666"},{"a78x","q3er","f2f"}};
	//二维字符串数组,每个数组元素是一个指向字符串常量的指针。
	
	printf("%s\n", s7[0]);
	printf("%s\n", s8[1]);
	printf("%s\n", s9[2]);
	printf("%s\n", s10[0][1]);

【有些编译器会因为将const char * 类型赋值给char * 类型变量而直接报错】
【数组第一维大小可以缺省,缺省时在s8的赋值方式下,需要保证每一行元素数量相等且等于4(包括’\0’在内)】
打印结果:
aaa
bbb
ccc
qwer

你可能感兴趣的:(字符串)