C没有字符串类型,底层使用字符数组来保存字符串。
两种定义字符串方式:
1、使用字符数组来保存字符串。char str1[] = "I love U";
相当于char str1[] = {'I',' ','l','o','v','e',' ','U','\0'};
2、使用字符指针来表示字符串。char* str2 = "I love U";
相当于char* str;
str = "I love U";
"I love U"底层是以字符数组形式存放的{'I',' ', 'l','o','v','e',' ','U','\0'}
最终返回的是指向数组第一个元素的地址,即指向字符类型的指针。然后将该指针赋给str1数组变量,而数组变量本身存放的就是指针。
所以字符指针也可表示字符串。char* str只是定义一个指针变量,并非定义一个字符串变量。
\0表示结束标志,不会被显示出来。
char str1[100] = "I love U"
计算定义长度为100的数组来定义一个字符串,底层会在最后一个元素后面加上\0作为结束标志,strlen()最终的长度为8
#include <stdio.h>
#include <string.h>
void stringtest1_1(){
char str1[] = {'I',' ','l','o','v','e',' ','U'};
printf("str1=%s,lenth=%d\n", str1,strlen(str1));
char str2[] = {'I',' ','l','o','v','e',' ','U','\0'};
printf("str2=%s,lenth=%d\n", str2, strlen(str2));
}
void stringtest1_2(){
//相当于char str1[] = {'I',' ','l','o','v','e',' ','U','\0'};
char str1[] = "I love U";
char* str2 = "I love U";
printf("str1=%s,lenth=%d\n", str1, strlen(str1));
printf("str2=%s,lenth=%d\n", str2, strlen(str2));
str2 +=5;
printf("str2=%s,lenth=%d\n", str2, strlen(str2));
}
void stringtestmain(){
stringtest1_1();
stringtest1_2();
}
输出:
str2 +=5表示将str指针指向后面第5个元素
字符指针作为函数参数:
void stringtest1_3(char* to, char* from){
//如果from指针指向的字符不为\0
while(*from){
*to++ = *from++;//将from指针指向的字符赋给to指针指向的元素
}
*to = '\0';
}
void stringtestmain(){
//stringtest1_1();
//stringtest1_2();
char* str1 = "I love U";
char str2[100];
stringtest1_3(str2, str1);
printf("str2=%s\n", str2);
stringtest1_3(str2, " hehe");
printf("str2=%s\n", str2);
}
输出:
字符指针和字符数组在很多地方可以相互替代,但需要注意几点:
1、字符数组底层真正存放了所有的字符,每个字符对应一个数组元素。而字符指针指向数组时只存放了字符数组的首地址。
2、字符数组只能在定义时赋值。char str1="I love U";不能分开写
而字符指针可以重复赋值。char* str2="xixi"; str2="hehe"
3、定义字符数组时,程序会为每个数组元素分配内存空间。而定义字符指针变量时,只定一个指针变量,指向的内存不确定。
char str[100];
scanf("%s", str);