1.字符串引用方式
(1)用字符数组存放一个字符串,可以通过数组名和下标引用字符串中一个字符,也可以通过数组名和格式声明 "%s"输出该字符串。
char string[] ="I Iove china";
printf("%c\n",string[7]);
(2)用字符指针变量指向一个字符串常量,通过字符串指针引用字符串常量
char * string="I love China";
printf("%s\n",string);
2.字符指针作函数参数
(1)用字符数组名作为函数参数
void copy_string(char from[] ,char to[]); //声明函数
char a[]="I an a teacher";
char n[]="You are a student";
copy_string(a,b); //调用函数
(2)用字符型指针变量作实参
void copy_string(char from[] ,char to[]); //声明函数
char a[]="I an a teacher";
char n[]="You are a student";
char *from=a,*to=b;
copy_string(from,to); //调用函数
实参 | 形参 | 实参 | 形参 |
字符数组名 | 字符数组名 | 字符指针变量 | 字符指针变量 |
字符数组名 | 字符指针变量 | 字符指针变量 | 字符数组名 |
3.使用字符数组指针变量和字符数组的比较
(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第一个字符地址)
(2)赋值方式,可以对字符指针变量赋值,但不能对数组名赋值
(3)初始化的含义,对字符指针变量赋初值
char a="I love china!";
等价于
char *a;
a="I love china!";
而对数组的初始化
char str[14]="I love china!";
不等价于
char str[14];
str[]="I love china"; //企图把字符串赋值给数组中的各个元素
(4)存储单元的内容。编译时为字符数组分配若干存储单元,以存放各元素的值,而对字符指针变量,只分配一个存储单元
char *a; //指针应及时赋值,如果未赋值,可能造成不良后果
scanf("%s",a); //错误
(5)指针变量的值可以改变的,而数组名代表是一个固定的值(数组首个元素地址),不能改变
char str[]={"I love china!"};
str=str+7; //错误,str存地址是常量
printf("%s",str);
(6)字符数组中各元素的值可以改变的(可以对他们再赋值),但字符指针变量指向的字符串常量的内容是不可以被取代
char a[]="House"; //字符数组初始化
char *b="House"; //字符指针变量b指向字符串常量的第一个字符
a[2]='r'; //合法 r会取代数组中的u
b[2]='r'; //非法
(7)引用数组元素。对字符数组可以用下标法(用数组名a[5])或者地址法(如 *(a+5))
(8)用指针变量指向一个格式字符串,可以用来替代printf函数中的格式字符串
char * fromat;
format="a=%d,b=%f\n";
print(format,a,b);
它相当于
printf("a-%d,b=%f",a,b);
只要改变指针变量format所指向的字符串,就可以改变输入输出的格式。这种printf函数称为可变格式输出函数
也可以用字符数组实现
char fromat[] ="a=%d,b=%f\n";
print(format,a,b);