先来点基础知识:
printf中分别代表的输出类型:
%c:字符
%d:有符号十进制整数
%f:浮点数(包括float和doulbe)
%e(%E):浮点数指数输出[e-(E-)记数法]
%g(%G):浮点数不显无意义的零"0"
%i:有符号十进制整数(与%d相同)
%u:无符号十进制整数
%o:八进制整数 e.g. 0123
%x(%X):十六进制整数0f(0F) e.g. 0x1234
%p:指针
%s:字符串
%%:"%"
字符指针 char *p,只可接收已知的字符串字面量,本身大小4byte(32位机)指向空间大小由已知字符串大小决定,可以不初始化。
定长字符数组 char a[100],可接收已知或未知的字符串,本身大小就是100,可以不初始化。
不定长字符数组 char b[ ],只可接收已知的字符串字面量,本身大小是已知字符穿大小+1,且必须初始化。
字符 char c,就是一个字符,占空间为1byte。
下面实验一下:
char *range1="6~200";
char range2[10]="5~500";
char range3[]="123456";
char range4='a';
char range5[6] = "123456";
char range6[2];
printf("\n the *range1 size(sizeof) is: %d \n", sizeof(range1));
printf("\n the *range1 size(strlen) is: %u \n", strlen(range1));
printf("\n the *range1 is: %s \n", range1);
printf("\n the range2[10] size(sizeof) is: %d \n", sizeof(range2));
printf("\n the range2[10] size(strlen) is: %u \n", strlen(range2));
printf("\n the range2[10] is: %s \n",range2);
printf("\n the range3[] size(sizeof) is: %d \n", sizeof(range3));
printf("\n the range3[] size(strlen) is: %u \n", strlen(range3));
printf("\n the range3[] is: %s \n",range3);
printf("\n the range3[5] is: %c \n",range3[5]);
printf("\n the range3[6] is: %c \n",range3[6]);
printf("\n the range4 size(sizeof) is: %d \n", sizeof(range4));
printf("\n the range4(c) is: %c \n",range4);
printf("\n the range5 size(sizeof) is: %d \n", sizeof(range5));
printf("\n the range5 size(strlen) is: %u \n", strlen(range5));
printf("\n the range5 is: %s \n",range5);
printf("\n the range5[5] is: %c \n",range5[5]);
printf("\n the range6 size(sizeof) is: %d \n", sizeof(range6));
printf("\n the range6 size(strlen) is: %u \n", strlen(range6));
printf("\n the range6 is: %s \n",range6);
下面是仿真值。range1是字符指针,其指向字符串常量。range2是定长字符数组,前五个字符是初始值,后面的5个字符默认为0或者说是‘\0’代替。range3是不定长字符数组,初始化的时候除了原有的6个字符又增加了1个字符‘\0’。range5是定长字符数组,其跟range2唯一的不同时,其大小恰好等于字符串的大小,那么就没有地方存储结束符‘\0’,若是有指针引用这个字符数组,那么就有风险,因为编译器直到遇到内存上顺序最近的’\0‘才会认为结束。rang6是没有初始化的字符数组,其值没有,那么编译器会随机赋一个初值。个人建议每个字符数组都要赋值,要是没有就赋NULL也就是('\0')。
下面是对应程序printf后的值,可以和仿真值对应。
不论是字符指针还是字符数组,其初始化时用到的字符串常量都存在rom或者flash这些非掉电丢失存储器件中。字符指针和字符数组本身是在ram区或者dram区。
运行的时候指针指向的字符串常量所在的存储位置,不搬运字符串,看笔者仿真图里面的rang1就明白了,这里面0x6001f99c对应flash区。运行的时候字符数组对应的字符串常量搬运到字符数组对应的空间位置,同样看rang2,这里面0x8042f590对应sdram区。
字符指针、字符数组都会用到strlen函数和sizeof操作符,这部分知识在此就不展开了。