ios第十天

/ 利用關鍵字 static 修飾的變量 叫做靜態變量 並且存儲在靜態區

// 特點如果你不給初值的話  默認 0

// 特點只初始化一次

// 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, 字節數)

    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章