(1) 用字符数组存储一个字符串,然后输出该字符串。
main(){
char string[]="I love China!";
printf("%s\n",string);
}
(2) 用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。
main(){
char *string="I love China!";
printf("%s\n",string);
}
理解:为什么字符串输出的时候是一个指针(即string),而不是*string?
1 数组名相当于指向数组第一个元素的指针,在访问数组元素及数组的过程中,其实是通过指针来访问数组的元素的。
2 因为实际上在内存中是把字符串的第一个元素的地址(字符数组也是其首元素的地址)赋给string的。在输出时,要用:printf(“%s\n”,string);,其中“%s”是输出字符串时所用的格式符,在输出项中给出字符指针变量名,则系统先输出它所指向的一个字符数据,然后自动是string加1,使之指向下一个字符,然后再输出一个字符……如此知道遇到字符串结束标志“\0”为止。
注意:可以通过字符数组名或者字符指针变量输出一个字符串。而对一个数值型数组,是不能企图用数组名输出它的全部元素的。例如:
int i[10];
………
printf(”%d\n”, i);
是不行的,只能逐个输出!!!!!!显然%s可以对一个字符串进行整体的输入和输出。
2 对变量,编译器,类型转换,指针加深理解的题目
#include <stdio.h>
int main(void)
{
char* str = "ABCDEFGHIJKL";
int* pInt = (int*)str; //类型转换
printf("%c\n%c\n",*(str+1),*(char *)(pInt+1));
return 0;
}
知识点理解:
1 其实数据在内存中的存储都是二进制的0与1,数据输出的时候,对应不同的数据类型时,编译器即将二进制转换为对应数据类型。char型存储时其实是以其ASCII码对应的二进制存储的。
2 指针相加减时,要看类型,打狗看主人,指针加减看类型,其运算的值n*sizeof(类型),比如:字符型地址加1,其实地址加也是sizeof(char) =1,整形地址加1,地址加sizeof(int) =4,结构体数组中,地址加1,地址加sizeof(结构体)。
本题中,’A’的ASCII码为97,*(char *)(pInt+1));即为97+4=101对应的char,实际为char型指针右移四位,故答案为 E.
本题答案为:
B
E