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