天天看點

C語言——二級指針

二級指針的概念

  首先任何值都有位址,一級指針的值雖然是位址,但這個位址做為一個值亦需要空間來存放,是空間就具有位址,這就是存放位址這一值的空間所具有的位址,二級指針就是為了擷取這個位址,

  一級指針所關聯的是其值(一個位址)名下空間裡的資料,這個資料可以是任意類型并做任意用途,但二級指針所關聯的資料隻有一個類型一個用途,就是位址,指針就是兩個用途提供目标的讀取或改寫,那麼二級指針就是為了提供對于記憶體位址的讀取或改寫

  指針的表現形式是位址,核心是指向關系指針運算符“*”的作用是按照指向關系通路所指向的對象.如果存在A指向B的指向關系,則A是B的位址,“*A”表示通過這個指向關系間接通路B.如果B的值也是一個指針,它指向C,則B是C的位址,“*B”表示間接通路C如果C是整型、實型或者結構體等類型的變量或者是存放這些類型的資料的數組元素,則B(即C的位址)是普通的指針,稱為一級指針,用于存放一級指針的變量稱為一級指針變量。

  A(即B的位址)是指向指針的指針,稱為二級指針,用于存放二級指針的變量稱為二級指針變量.根據B的不同情況,二級指針又分為指向指針變量的指針和指向數組的指針.

  在如上的A指向B、B指向C的指向關系中,如果A、B、C都是變量,即C是普通變量,B是一級指針變量,其中存放着C的位址,A是二級指針變量,其中存放着B的位址,則這3個變量分别在記憶體中占據各自的存儲單元,它們之間的互相關系下圖所示,互相之間的前後位置關系并不重要.此時,B是一級指針變量,B的值(即C的位址)是一級指針資料;A是二級指針變量,A的值(即B的位址)是二級指針資料.

  在C語言中,數組與其它變量在使用上有很大的不同.無論是字元型、整型、實型變量,還是結構體類型或者指針類型的變量,語句中出現變量名都代表對該變量所在記憶體單元的通路,變量名代表整個變量在記憶體中的存儲單元,可以向該變量指派,也可以從中取出資料使用.但是定義一個數組之後,數組名并不代表整個數組所占據的記憶體單元,而是代表數組首元素的位址.

二級指針例子:

int*q;  //定義一個一級指針變量,它指向一個普通變量(即它存的是一個變量的位址)

int**p;  //定義一個二級指針變量,它指向一個指針變量(它存的也是一個變量位址,隻不過是一個指針變量的位址)

ints;

q =&s;  //q中存的是整型變量s的位址,是以q是一級指針

p =&q;  //p中存的是一級指針q的位址,是以p是二級指針

例子2:

# include<stdio.h>

void f(int ** q);

int main(void)

{

    int i =9;

    int * p =&i;// int  *p;  p= &i;

   printf("%p\n", p);

   f(&p);

   return 0;

}

void f(int ** q)

    *q = (int*)0xFFFFFFFF;// 這裡是更改了p的值,與i無關,p不再指向i

繼續閱讀