人之所以痛苦,那是因为你在成长。--------magic_guo
在内存中,字符串是以数组的形式存储的,在C程序中,字符串是存放在字符数组中的,因此知道了数组与指针的关系,就可以更加了解指针与字符串的关系。
1.在C语言中对于字符串引用方式:
①通过数组名引用字符串
# include<stdio.h>
// 通过数组名引用字符串
int main(void)
{
char string[] = "I love China!";
printf("%s\n", string);
printf("%c\n", string[7]);
return 0;
}
// %s可以对一个字符串进行整体的输入输出
/* 通过字符数组名或字符指针变量可以输出一个字符串,
而对于一个数值型数组,是不能企图用数组名输出它的全部元素的,对数值型数组的元素只能逐个输入或者输出 */
②通过指针变量引用字符串
int main(void)
{
char * string;
string = "I love China!";
printf("%s\n", string);
return 0;
}
// 通过指针变量引用字符串常量和通过数组名引用字符串常量的区别
// 初始化:
// char * string = "I love China!";等价于
// char * string;
// string = "I love China!";
// 使用数组名
// string[] = "I love China!";
// 并不等价于
// char string[];
// string = "I love China!";
// 数组可以在定义时对各个元素进行赋初值,但是不能用赋值语句对字符数组中的全部元素整体赋值。
例题:
# include<stdio.h>
// 将字符串a复制到字符串b,然后输出字符串b
// 普通方法
int main(void)
{
char a[] = "I am a student!", b[20];
int i;
for (i=0; a[i]!='\0'; i++)
{
b[i] = a[i];
}
b[i] = '\0';
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
// 普通方法嵌入指针表示
int main(void)
{
char a[] = "I am a student!", b[20];
int i;
for (i=0; *(a+i)!='\0'; i++)
*(b+i) = *(a+i);
b[i] = '\0';
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
// 使用指针变量
int main(void)
{
char a[] = "I am a student!", b[20], *p, *q;
p = a, q = b;
for (; *p!='\0'; p++,q++)
*q = *p;
*q = '\0';
printf("a = %s\n", a);
printf("b = %s\n", b);
return 0;
}
2.字符指针作函数参数
①使用字符数组名做函数的形参和实参
# include<stdio.h>
// 定义一个copy_string函数来实现字符串复制的功能
// 使用字符数组名做函数的形参和实参
int main(void)
{
void copy_string(char from[], char to[]);
char a[] = "I am a teacher!";
char b[] = "You are a farmer!";
printf("string a=%s\nstring b=%s\n", a, b);
printf("copy string a to string b:\n");
copy_string(a, b);
printf("string a=%s\nstring b=%s\n", a, b);
return 0;
}
void copy_string(char from[], char to[])
{
int i = 0;
while (from[i]!='\0')
{
to[i] = from[i];
i++;
}
to[i] = '\0';
}
//可将copy_string函数的循环体改成:
//while (from[i]!='\0') 因为计算机内部是使用ASCII码进行运算的,'\0'的ASCII码对应的是0.
②使用字符指针变量作为函数的形参和实参
# include<stdio.h>
// 使用字符指针变量作为函数的形参和实参
int main(void)
{
void copy_string(char * from, char * to);
char a[] = "I am a teacher!";
char b[] = "You are a farmer!";
char * p, *q;
p = a, q = b;
printf("string a=%s\nstring b=%s\n", a, b);
printf("copy string a to string b:\n");
copy_string(p, q);
printf("string a=%s\nstring b=%s\n", a, b);
return 0;
}
void copy_string(char * from, char * to)
{
while ((*to=*from)!='\0')
{
to++, from++;
}
}
3.字符变量与字符数组的比较
①字符数组由若干个元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址(字符串中第一个字符的地址),绝不是将整个字符串放到字符指针变量中。
②赋值方式不同:可以对字符指针变量赋值,但不能够对数组名赋值
原因:数组名虽然代表地址,但他是常量,常量的值是不能改变的;但是数组可以在定义时对各元素赋初值。
③字符数组中各元素的值是可以改变的,但字符指针变量指向的字符串常量中的内容是不可以被取代的。
例子:
# include<stdio.h>
int main(void)
{
char a[] = "I am a teacher!";
char * b = "You are a farmer!";
a[2] = 'l'; // 合法,l取代a数组元素a[2]的原值a
b[2] = 'l'; // 不合法,字符串常量是不能被改变的
return 0;
}