指標是一種儲存變數位址的變數,存放在一組連續的儲存單元中(通常是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...