指针03-指针和字符串
1.字符串和字符数组
字符数组 :
char arr[6] = {'A','B','C','D','E','F'};
字符串:
char names[] = "ABCDE";
注意:编译器会在后面添一个 00 做为字符串的结束标记。
用%s可以输出字符串;
%s:打印一个字符串,直到内存为 0 为止;
例如:
可以看出来,由于字符数组没有0结尾,而输出了乱码;
%s只输出到0的地方:
字符串相当于以00结尾的字符数组
2.字符串常量
1)内存分布
字符串在编译后会保存在常量区,因此是可读不可写的;
2)两种变量接收字符串的方式
char* x = "china";
char y[] = "china";
void Function()
{
*(x+1) = 'A'; //报错,因为常量区不可修改,而变量x保存的是常量区"china"字符串的地址;
y[1] = 'A'; //不报错并且修改成功;因为变量y保存的是字符数组的首地址,该数组中的值是常量区的"china"复制了一份;
}
3)反汇编分析
1】char* x = "china"
2】char y[] = "china"
3.常见的字符串操作
1)int strlen (char* s)
返回值是字符串s的长度。不包括结束符'/0'。
实现:
int strlen(char* s){
int len = 0;
while(*s != 0){
len++;
s++;
}
return len;
}
2)char* strcpy (char* dest, char* src);
复制字符串src到dest中。返回指针为dest的值。
实现:
char* strcpy(char* dest, char* src){
char* ret = dest; //修改后也可返回dest开始处
while(*(dest++) = *(src++)); //!=0可以省略;整个表达式的值为0时while循环结束
return ret;
}
3)char* strcat (char* dest, char* src);
将字符串src添加到dest尾部。返回指针为dest的值。
实现:
char* strcat (char* dest, char* src){
char* ret = dest; //防止dest++后改变的值返回
while(*dest != 0){
dest++;
}
while(*(dest++) = *(src++));
return dest;
}
4)int strcmp ( char* s1, char* s2);
一样返回0 不一样返回1
实现:
int strcmp(char* s1, char* s2)
{
while(*s1 != '\0' && *s2 != '\0')
{
if(*s1 != *s2)
{
return 1;
}
s1++;
s2++;
}
if(*s1 == '\0' && *s2 == '\0')
{
return 0;
}
else
{
return 1;
}
}