char *str 和char str[]的区别

2019-12-27  本文已影响0人  越来越胖了

首先看例子:

   char *str1 = "abcd1234";
    char *str2 = "abcd1234";
    char str3[] = "abcd1234";
    char str4[] = "abcd1234";
    printf("%p %p\n",str1,str2);//地址一样
    printf("%p %p\n",str3,str4);//地址不一样

//**************************************************
 //用strncpy来进行测试,意思为将str2的前四个字节的内容复制到str1中
    char *str1 = "abcd1234";
    char str2[20] = "efgh5678";
    char str3[30] = "";
    if(1){
        strncat(str3,str2,4);//  strncat(str1,str2,4) 崩溃
    }else{
        strncat(str2,str1,4);//正常
    }
    printf("%s\n",str1);
    printf("%s\n",str2);
    printf("%s\n",str3);

char str[]:这里面的str表示一个char类型的数组指针,该指针所指向的数组内容是保存在栈上面的,是可以修改的。

而char*str是一个字符串指针,这个指针指向的是字符串第一个字符的地址,而这个指针存在栈上,但是字符串的内容并不在栈里面,而在字符常量区域里面储存。

所以查看char *str1 = "abcd1234"与char *str2 ="abcd1234"的地址时,他们都是储存的字符a的地址,所以这个地址时相同的,所以其 %p 的值也是一样的;

但是char str3[] = "abcd1234" 与 char str4[] = "abcd1234"是分别两个char类型的数组,而str3与str4分别表示的是char型的数组指针,所以他们的地址时不同的。

下面是字符串的翻转的方法:


 char ch[] = "12345678";
 char_reverse(ch);

//方法:
void char_reverse(char *cha){
    
    // 定义第一个字符
    char *begin = cha;
    // 定义个末尾
    char *end   = cha + strlen(cha) - 1;
    while (begin < end) {
        // 核心逻辑 -- 值换 移动
        char lg_tmp = *begin;
//        *(begin++)  = *end;
        *(begin)  = *end;
        begin++;
        
        *(end)    = lg_tmp;
        end--;
        
        🔥修改对应地址指针的值: begin是把前四个地址位上的数据变成了 变成8765    
          end是把后面四个地址位上的数据 变成了4321
          能够理解这个写法,应该就掌握的差不多了;        

    }
}

``
上一篇下一篇

猜你喜欢

热点阅读