C 指標與位址

2021-06-27 14:08:29 字數 2306 閱讀 6614

指標是一種儲存變數位址的變數,存放在一組連續的儲存單元中(通常是2或4個,後者居多)。因為c語言本身的feature就很少,加上指標又非常的高效,指標已然成了c最大的特點。與指標相關的操作符有兩個,分別為 * (解引用)和 & (取位址),解引用這個詞比較令人費解,比方存在指標p, p = &c ,p中便儲存了 c 的位址,通過 * p 來得到位址中的內容,所以我更喜歡將它看做「解指標」,解開指標中的內容嘛

還是用上面這麼例子

int a = 5;

int *p = &a;

printf("%d",*p);

printf("%p",p)

第乙個printf輸出了指標p所指的物件a,即5 ,第二個printf輸出了p儲存的內容,即a的位址。注意,取位址符號&只能作用於記憶體中的物件,即變數與陣列元素,不能作用於表示式,常量或register變數。

再舉一栗

int a = 5;

int *p = &a;

printf("%d",*p);

int *q = p;

*q = 10;

printf(''%d",*p);

第乙個printf輸出5沒問題,接著又把p賦給了另乙個指標變數q,此時,q中也儲存了a的位址,對 *q的修改就是對 a 的修改,再輸出 *p 的時候結果已經變成10了

那麼既然指標儲存的是位址,那麼指標能不能保證另乙個指標的位址呢?顯然可以嘛,這就是所謂的

int a = 5;

int *p = &a;

int **q = &p;

不妨分別輸出 p, *p ,q ,*q ,**q看一看,其中,p 是 a 的位址,*p 是5,q 是p的位址,*q是p儲存的內容,即a的位址,**p是5,如果覺得抽象的話可以畫張圖來看看,典型的鍊錶的結構

記憶體把若干的儲存單元(以位元組表示最小單元)有序的組織起來,並在邏輯層面上給我們提供了乙個位址,比如0x11ff88(通常以16進製表示),而單個位元組又太小不足以表示出所有的資料型別,就把4個位元組合併為了乙個字(比如32位的系統),來存放資料。那麼,知道了位址就可以把裡面的資料去出來了嗎?非也。光知道位址還不夠的,還得知道裡面的資料儲存的方式(大小端)和資料的型別,否則即使取出來也多是沒用的亂碼

short int x;

char x0,x1;

x=0x1122; //11是高位元組,22是低位元組

x0=((char *)&x)[0]; //低位址單元

x1=((char *)&x)[1]; //高位址單元

printf("x0=0x%x,x1=0x%x\n",x0,x1);//小端模式,高位元組放在高位址中 大端模式,高位元組放在低位址中

知道了機器儲存資料是按大端還是小端的,我們就知道按什麼順序去乙個位元組乙個位元組的讀裡面的資料了,之所以平時用不到是因為機器已經幫我們做好了。

舉個例子,我們可以乙個位元組乙個位元組讀讀乙個4位元組的int,並輸出其二進位制的表示

void print_2(int val2)

printf(" ");

}}

比如62,輸出 00000000 00000000 00000000 00111110

假設我現在已經知道了乙個位址是0x11ff00,以此開頭的位址存放著乙個int 型的數,62,機器是按小端的方式儲存的,即

0x11ff03          00000000

0x11ff02 00000000

0x11ff01 00000000

0x11ff00 00111110

怎麼取呢?首先,要將對應的位址轉換為相應型別的指標,這樣編譯器才知道你要去多長

比如,要把這個int型的62取出來,先將位址強制轉型為 int*,  (int *)(0x11ff00)  ,在通過 * 將其中的內容取出來。(ps:在實際中別這麼寫,位址不能隨便訪問的,你可以寫成 &a 來取變數的位址)

若只取 0x11ff00這乙個位元組呢?

char *j = (char*)(0x11ff00);

printf("%d\n",*j );

printf("%c\n",*j);

注意,在只取了乙個位元組後,分別按照了不同方式列印,%d列印出的是62,而%c列印出的是 > ,對照ascii碼,62對應的正是 >,可見的確只列印出了乙個位元組。

好了,先記下這麼多,指標太博大精深,日後再慢慢**

C 指標與位址詳解

1 儲存器 的概念 2 儲存器的使用 1 定義變數時,系統為變數分配相應的儲存單元,通過變數名可以直接使用該儲存單元。例如 int x 5,y y 15 y可以理解成該儲存單元的當前名字 2 通過儲存單元的位址來使用該儲存單元,這就需要有表示儲存單元位址的量 指標型變數。例如 int ip ip是乙...

指標與指標位址

int urn size urn 0 100 urn 1 200 urn 2 300 urn 3 400 urn 4 500 int ptr1,ptr2,ptr3 ptr1 urn ptr2 urn 2 printf 當前指標的值和位址 printf ptr1 p,ptr1 d,ptr1 p n p...

指標與位址

1.include int main int argc,const char argv 這是乙個指標陣列,裡面所有的元素都是指標,但這裡的指標是乙個位址常量,比如 aaaaa 本身就是乙個位址 直接使用 p,就可以列印出這一固定的位址值。printf p p n aaaaa bbbbb printf...