1. 程式人生 > >C語言入門篇(二)指標的介紹和運用

C語言入門篇(二)指標的介紹和運用

 一.記憶體

  1.記憶體的含義:

    記憶體是溝通CPU和硬碟的橋樑: 

      (1)暫存CPU中的運算資料

      (2)暫存與外部儲存器交換的資料

    物理儲存器:實際存在的具體儲存器晶片

               主機板上裝插的記憶體條

            顯示卡上的顯示RAM晶片

          各種適配卡上的RAM晶片和ROM晶片

     存址空間:對儲存器編碼的範圍。我們在軟體上常說的記憶體是指這一層含義

      (1)編碼:對每個物理儲存單元(一個位元組)分配一個號碼

      (2)定址:可以根據分配的號碼找到相應的儲存單元,完成資料的讀寫

         理解:可以將記憶體 抽象理解為一個超大的一維字元陣列,通過下標(對每個位元組分配的號碼-與作業系統有關,例如 作業系統為32位,號碼就是32位的編號)

         拓展:現在可以理解為什麼系統會影響記憶體的效能,32位作業系統定址範圍 就是 2的32次方也就是4G 所以最大記憶體為4G

  指標和指標變數:

      (1)記憶體中每一個位元組都有自己的編號,這就是“地址”

      (2)如果程式中定義了一個變數,程式執行或者編譯時,系統就會給這個變數分配記憶體單元,並確定他的地址(編號)

      (3)指標實質就是記憶體“地址”。指標就是地址,地址就是指標

      (4) 指標是記憶體單元的編號,指標變數是存放地址的變數

  

  關於野指標,空指標,萬能指標大家可以去找些資料,這裡只貼程式碼,不做解釋

  此處強調一下 ,將NULL賦給指標,此指標就被稱為空指標,因為NULL是一個值為0的巨集常量

  什麼是巨集?

    (百度百科)巨集是一種規則或模式,或稱語法替換 ,用於說明某一特定輸入(通常是字串)如何根據預定義的規則轉換成對應的輸出(通常也是字串)。這種替換在預編譯時進行,稱作巨集展開。

  二:const修飾指標變數

    const 限定一個變數不允許被改變,產生靜態作用

    用const修飾變數是不安全的 (可以通過高一級指標修改)

    const int * i  = &a    等價於 int const * i = &a    此時const修飾的是 int *  ,所以 *i 是不允許賦值 ,也就是不能間接修改a的值,但是指向地址可以 修改 如 i = &b 

    int * const i = &a     此時const修飾的是 變數 i ,所以i 指向的地址不能修改,但是 *i = 200 可以通過,也就修改了a 的值

    const int *  const i = &a  值和地址都不能修改   

  三:指標和陣列

    int [] i = {1,2,3,4,5};

    i 為陣列第一個元素的地址,但他是一個常量

    i = 10 ;   // 發生錯誤,因為雖然 i 指向元素地址,但是i是一個常量

    sizeof() 方法 ,判斷佔用多少位元組

  四:指標加減運算

    指標的加減運算不像我們所想到加減

    如果一個 int * ,+1的結果就是增加了一個int 型別大小   -----int * i = 20; i = i+1;  就是原地址移動4位

    如果是一個char *,+1的結果是增加一個char大小 --------  ...

    什麼型別 * + 1 就移動原地址一個型別位 (指標乘除沒有意義)

  五:多級指標

    C語言允許有多級指標存在,在實際的程式中一級指標最常用,其次是二級指標。

    二級指標就是指向一個一級指標變數地址的指標,三級......

    int a = 1;

    int * b = &a;  //一級指標,指向a的地址

    int **c = &b; // 二級指標,指向b的地址 ,*c 就是 b , *cc 就是 a

    int ***d = &c; //三級指標,指向c的地址,*d就是c,**d就是b,***d就是a