pragma mark 指針和字符串
pragma mark 概念
/**
*
1棧 - 有編譯器自動(dòng)分配釋放 (可以修改)
2堆 - 一般由程序員分配釋放,若程序員不釋放肪笋,程序結(jié)束時(shí)可能由OS回收
3全局區(qū)(靜態(tài)區(qū))月劈,全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域藤乙,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域猜揪。 程序結(jié)束釋放。
常量區(qū)是不可以修改的
*/
/*
main()
{
int b; 棧
char s[] = "abc ";棧
char *p2; 棧
char *p3 = "123456 "; 123456\0在常量區(qū)坛梁,p3在棧上而姐。
static int c =0; 全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得來(lái)得10和20字節(jié)的區(qū)域就在堆區(qū)罚勾。
strcpy(p1, "123456 "); 123456\0放在常量區(qū),編譯器可能會(huì)將它與p3所指向的 "12345
6 "優(yōu)化成一塊吭狡。
}
*/
pragma mark 代碼
#include <stdio.h>
int main()
{
//保存字符串
char str[] = "lyh"; // 棧
printf("str = %s\n",str);
str[0] = 's';
printf("str = %s\n",str);
// 因?yàn)閿?shù)組名就是數(shù)組的地址,數(shù)組名保存的就是數(shù)組的第0個(gè)元素的地址,所以我們可以使用指針來(lái)保存字符串
// 通過(guò)指針保存一個(gè)字符串,其實(shí)就是保存的字符串第0個(gè)元素的地址
char *str2 = "lys"; // 常量區(qū)
printf("str2 = %s\n",str2);
// str2[0] = 's';
printf("str = %s\n",str2);
#warning 通過(guò)數(shù)組保存字符串 和通過(guò)指針保存字符串 的 區(qū)別
// 如果通過(guò)數(shù)組 來(lái) 保存字符串,那么字符串是一個(gè)變量 str 可以修改
// 如果通過(guò)指針 來(lái) 保存字符串,那么字符串是一個(gè)常量 str 不能修改
// 數(shù)組保存的字符串 存儲(chǔ)在內(nèi)存的 棧中, 而通過(guò) 指針保存的字符串存儲(chǔ)在常量區(qū)
// 存儲(chǔ)在 棧 中的變量有一個(gè)特點(diǎn), 當(dāng)作用域結(jié)束 系統(tǒng)會(huì)自定釋放該變量
// 存儲(chǔ)在 常量區(qū) 的值 有一個(gè)特點(diǎn),不會(huì)被釋放,而且多個(gè)相同的值對(duì)應(yīng)的地址相同
// 棧
char str3[] = "lyh";
printf("str = %p\n",str);
printf("str3 = %p\n",str3);
// 常量區(qū)
char *str4 = "lys";
printf("str2 = %p\n",str2);
printf("str4 = %p\n",str4);
// 利用指針保存字符串的應(yīng)用場(chǎng)景
for (int i = 0; i < 100; i++) {
// 意味著開(kāi)辟存儲(chǔ)空間來(lái)保存lyh這個(gè)字符串
// 并且會(huì)釋放100次
// char str5[] = "lyh";
char *str6 = "lyh"; // 只開(kāi)辟一次 存儲(chǔ)空間
printf("str = %s\n",str6);
}
#warning 保存字符串的兩種方式:
/*
char str[] = "lyh";
存儲(chǔ)的位置 : 棧
字符串可以修改
char *str = "lyh";
存儲(chǔ)的位置 : 常量區(qū)
特點(diǎn): 相同的字符串不會(huì)重復(fù)的分配存儲(chǔ)空間
字符串不可以修改
*/
return 0;
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者