指针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;    
    }        
}
 
 
 
 
posted @ 2019-09-29 10:22  L丶银甲闪闪  阅读(241)  评论(0编辑  收藏  举报