您好,登錄后才能下訂單哦!
/ 利用關(guān)鍵字 static 修飾的變量 叫做靜態(tài)變量 并且存儲(chǔ)在靜態(tài)區(qū)
// 特點(diǎn)1 如果你不給初值的話 默認(rèn) 為0
// 特點(diǎn)2 只初始化一次
// 在main函數(shù) 上面 是全局靜態(tài)變量
// 在main函數(shù) 里面 叫局部靜態(tài)變量 作用域是大括號(hào)內(nèi)
void function(){
int a = 5;
int b = 6;
printf("%d,%d",a,b);
}
int main(int argc, const char * argv[]) {
// 內(nèi)存劃分為5個(gè)區(qū)域
// 棧區(qū) 堆區(qū) 靜態(tài)區(qū) 常量區(qū) 代碼區(qū)
// 內(nèi)存地址 由高到低
// 學(xué)習(xí)目標(biāo) 按順序記憶
#pragma mark -- 代碼區(qū)
// 電腦的存儲(chǔ) 都是以二進(jìn)制數(shù)據(jù)進(jìn)行存儲(chǔ)的
// 咱們寫得代碼 會(huì)被系統(tǒng)轉(zhuǎn)化成二進(jìn)制數(shù)據(jù) 存儲(chǔ)代碼區(qū)
#pragma mark -- 常量區(qū)
// 常量區(qū) 存儲(chǔ)的常量特點(diǎn)
// 把 h 更改成 w
// char *str = "zhuang";
// 常量 是程序運(yùn)行期間 不能改變量
// str = "haha"; // 指針的賦值 就是重指向
// char str[] = "zhuang";
// str[1]='w';
// 數(shù)組名字 地址 數(shù)組首元素的地址
// 數(shù)組首元素的常量地址
// 是把常量字符串 拷貝到棧區(qū)
#pragma mark -- 靜態(tài)區(qū)
// 靜態(tài)區(qū): 存儲(chǔ)兩種變量
// 1. 靜態(tài)變量
// 2. 全局變量
// 3. 靜態(tài)區(qū)變量 保存周期:直到程序運(yùn)行結(jié)束 靜態(tài)變量才會(huì)被釋放(伴你到永生)
#pragma mark -- 棧區(qū)
// int num1 = 5;
// int num2 = 10;
// int num3 = 15;
// printf("%p\n",&num1);
// printf("%p\n",&num2);
// printf("%p\n",&num3);
// 棧區(qū)有多大?
// 大概7M-8M
// char str[8187 * 1024] = {0};
// 出棧 入棧的規(guī)則
// 先入棧的 后出棧 先入棧的 在棧低
// 入棧 可以叫 壓棧
// 出棧 的順序 從棧頂開始 出棧
// int num1 =5;
// int num2 = 10;
// int num3 = 15;
// function();
// 之所以棧區(qū)容量不是特大 又不出現(xiàn)奔潰的現(xiàn)象 是因?yàn)?/span> 棧區(qū) 頻繁進(jìn)行 出棧 和入棧 只要一次性 不把棧空間堆滿 不會(huì)輕易出現(xiàn)崩潰
// 定義變量的時(shí)候 切記 給初值 避免出現(xiàn)莫名其妙的問題
#pragma mark -- 堆區(qū)
// 堆區(qū) 是程序員開辟空間 是程序員釋放空間
// 手動(dòng)開辟空間 手動(dòng)釋放空間
// 堆區(qū)空間 大概就是咱們內(nèi)存全部空間
// 開辟空間函數(shù)
// void * 表示無類型指針 可以轉(zhuǎn)換成任何類型的指針
// void *malloc(<#size_t#>)
// size 開辟空間大小 開辟多少字節(jié)空間
// 給整型指針p 指向的位置 開辟了4個(gè)字節(jié)的 堆內(nèi)存空間
// int *p = malloc(4);
// *p = 10;
// printf("%d \n",*p);
//
// char *str = malloc(8);
// strcpy(str, "wang"); // 正確的
// strcpy(str, "wangwangwang");// 錯(cuò)誤的, 開辟多少空間 就要用多少空間 不要超過開辟的空間
// printf("%s",str);
// int *p1 = malloc(4);
// *p1 = 5;
// short *p2 = malloc(4); // 開辟多少空間 最好你就用多少
// *p2 = 10;
// *(p2 + 1) = 15;
//
// 釋放空間函數(shù)
// free(<#void *#>)
// 1 .標(biāo)記刪除 不會(huì)抹去該空間存儲(chǔ)的數(shù)據(jù) 只會(huì)把這塊空間標(biāo)記為可用
// 2. 把指針置為空
// 開辟空間
// int *p = malloc(4);
// // 使用空間
// *p = 10;
// printf("%d\n",*p);
// // 釋放空間
// free(p);
// p =NULL;
// int *p = malloc(sizeof(int) * 5);
// for (int i = 0; i < 5; i++) {
// *p = i + 1;
// p++;
// }
// // 指針地址發(fā)生變化 釋放了本不屬于你開辟的區(qū)域 這時(shí)候程序崩潰
//
//
// // 修改 把指針移回去
// for (int i = 0; i < 5; i++) {
// p--;
// }
// free(p);
// p = NULL;
//
//**********************************************************************
// char str[] ={"dj5s5f"};
// // 計(jì)算出有多少個(gè)數(shù)字
// int count = 0;
// for (int i = 0; i < strlen(str); i++) {
// if (str[i] >= '0' && str[i] <= '9') {
// count++;
// }
// }
// char *strValue = malloc(count + 1);
// int index = 0;
// for (int i = 0; i < strlen(str); i++) {
// if (str[i] >= '0' && str[i] <= '9' ) {
// strValue[index] = str[i];
// index++;
// }
// }
// strValue[index] = '\0';
// printf("%s",strValue);
// free(strValue);
// strValue = NULL;
//
//*******************************************************************
// char *words[3] = {0};
// char str[] = {0};
// for (int i = 0; i < 3; i++) {
// printf("請(qǐng)輸入一個(gè)字符串");
// scanf("%s",str);
// printf("%lu",strlen(str));
// words[i] = malloc(strlen(str) + 1);
// // 保存字符串
// strcpy(words[i], str);
//
// }
//
//
//
// for (int i = 0; i < 3; i++) {
// printf("%s",words[i]);
// free(words[i]);
// words[i] = NULL;
// }
//
// ************************************************************
// 其他分配堆內(nèi)存函數(shù)
// 在堆內(nèi)存當(dāng)中 開辟 n * size 個(gè)空間 并且把開辟的內(nèi)存空間清零
// 因?yàn)橛幸粋€(gè)清零的過程 所有效率偏低
// calloc(int n , size);
// 重新分配函數(shù)
// realloc(原來分配的地址, 新空間大小)
// 情況1: 如果原來分配的地址 可以擴(kuò)充空間 那么就在原地址擴(kuò)充
// 情況2: 如果原來分配的地址 不能擴(kuò)充了 那么系統(tǒng)會(huì)重新分配一個(gè)空間 并且把原來地址存儲(chǔ)的數(shù)據(jù)拷貝到新空間里 然后系統(tǒng)自動(dòng)釋放原地址的空間
//
// int *p_old = malloc(10);
// int *p_new =realloc(p_old, 15);
// printf("%p %p\n",p_old,p_new);
//
//
// 內(nèi)存操作函數(shù)
// 把開辟的空間 多少字節(jié) 重置成C
// memset(開辟的空間的指針, int c, 字節(jié)數(shù))
// 用途: 把開辟好的空間 清零
// int *p = malloc(sizeof(int) * 4);
// for (int i = 0; i < 4; i++) {
// p[i]=i + 5;
//
// }
// // 清零
// memset(p, 0, sizeof(int) * 4);
// for (int i = 0; i < 4; i++) {
// printf("%d",p[i]);
// }
// 內(nèi)存拷貝函數(shù)
// 從來源 拷貝 到 目的地 多個(gè)字節(jié)
// memcmp(目的地, 來源, 字節(jié)數(shù))
// 內(nèi)存比較函數(shù)
// 兩個(gè)地址 按字節(jié) 進(jìn)行比較 返回第一個(gè)不同的差值
// memcmp(指針1, 指針2, 字節(jié)數(shù))
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。