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
能够理解这个写法,应该就掌握的差不多了;
}
}
``