通過數(shù)組保存字符串和通過指針保存字符串的區(qū)別
int main(int argc, const char * argv[]) {
// 保存字符串
char str[] = "lnj";
printf("str = %s\n", str);
str[0] = 'm';
printf("str = %s\n", str);
// 因為數(shù)組名就是數(shù)組的地址, 數(shù)組名保存的就是數(shù)組的第0個元素的地址,所以我們可以使用指針來保存字符串
// 通過指針保存一個字符串, 其實就是保存的字符串第0個元素的地址
char *str2 = "lmj";
printf("str2 = %s\n", str2);
// str2[0] = 'm';
printf("str2 = %s\n", str2);
// 通過數(shù)組保存字符串和通過指針保存字符串的區(qū)別
// 如果通過數(shù)組來保存字符串, 那么字符串是一個變量 str 可以修改
// 如果通過指針來保存字符串, 那么字符串是一個常量 str2 不能修該
// 數(shù)組保存的字符串存儲在內(nèi)存的棧中, 而通過指針保存的字符串存儲在常量區(qū)
// 存儲在棧中的變量有一個特點, 當(dāng)作用域結(jié)束系統(tǒng)會自動釋放該變量
// 存儲在常量區(qū)中的值有一個特點, 不會被釋放, 而且多個相同的值對應(yīng)的地址相同
char str3[] = "lnj";
printf("str = %p\n", str);
printf("str3 = %p\n", str3);
char *str4 = "lmj";
printf("str2 = %p\n", str2);
printf("str4 = %p\n", str4);
// 利用指針保存字符串的應(yīng)用場景
for (int i = 0; i < 100; i++) {
// 意味著會開辟100塊存儲空間來保存xmg這個字符串
// 并且會釋放100次
// char str5[] = "xmg";
char *str6 = "xmg";
printf("str5 = %s\n", str6);
}
/*
保存字符串的兩種方式:
char str[] = "lnj";
存儲的位置: 棧
特點: 相同的字符串會重復(fù)的分配存儲空間
字符串可以修改
char *str = "lnj"
存儲的位置: 常量區(qū)
特點: 相同的字符串不會重復(fù)的分配存儲空間
字符串不可以修改
*/
return 0;
}
注意點
int main(int argc, const char * argv[]) {
/*
// 指針沒有被初始化不能隨便使用, 野指針
int *p;
printf("*p = %i\n", *p);
*/
/*
char str[10];
scanf("%s", str);
printf("str = %s\n", str);
*/
// 1.指針沒有初始化, 野指針
char *str;
scanf("%s", str);
printf("str = %s\n", str);
// 注意: 用指針來保存字符串不可以被修改
// 指針沒有初始化不能隨便使用
return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。