幫助初學者瞭解C語言指標的基本含義
1. 指標是什麼
首先需要明白,指標也是一個變數,但是指標的大小是固定的,這是由作業系統決定的,32位的作業系統的指標的大小就是32位(4個位元組),64位的系統就是64位(8個位元組)。
這裡我們先定義兩個不同型別的指標(ptr和ppp),並指向一個相同的變數。
int *ptr;
char *ppp;
int a = 0x12345678;
ptr = &a;
ppp = (char *)&a;
假如這兩個指標放到32位的機器上,那麼sizeof(ptr)和sizeof(ppp)的值均為4。假如放到64位的機器上,那麼sizeof(ptr)和sizeof(ppp)的值就變成8了。
其次呢,指標是用來指向一段記憶體空間的首地址的,我自己的理解的指標就是一個標籤。比如說我約了客戶來公司談生意,那我要告訴他我們公司在哪裡,我得告訴他,公司在xx區xx街道xx號xx樓(這個就等同於資料的地址)這樣才能確保他不會走錯地方,但是這樣太麻煩了,所以我們製作了個人名片(就相當於指標),上面就有公司的詳細地址,我只要在需要的時候給別人我們公司的名片就好了,別人就可以通過名片上的地址精確地找到公司在哪裡。
這裡我們用上面程式碼作為例子簡單畫了一個示意圖如下(地址是假想的),那麼可以清楚ptr和ppp的值都是0x12340000。
2. 指標的型別
我們知道在定義指標的時候都需要給指標賦予相應的型別,當用到指標的時候編譯器就會知道要到那個上去尋找相應資料,同時編譯器也是通過指標的型別來知道應該拿多大或者說拿多少個位元組的資料。(因為我們知道資料在讀取的時候都是以位元組為單位的。)
可以看到我們在定義變數a的時候說明了a是int型別的,但是ppp是“char *”型別的,因此我們要是想用ppp指向a的時候就會出現賦值語句兩邊型別不匹配,編譯器就會給你報錯。但是無妨,我們可以用強制型別轉換,將賦值語句兩端的量變為同樣的“char *”型別。
此時如果我們用如下的程式碼編譯執行:
int main (void)
{
int *ptr;
char *ppp;
int a = 0x12345678;
ptr = &a;
ppp = (char *)&a;
int x = *ptr;
int y = *ppp;
printf("*ptr = %#x\n*ppp = %#x\n",x, y); //printf的%x格式化輸出是十六進位制輸出,加上“#”輸出字首
return 0;
}
產生的輸出如下:
大寫的W、T、F?為什麼a明明是0x12345678,兩個同樣指向a的指標取出來的值缺不一樣呢?因為,用char型別定義的指標在取值的時候只拿char型別的大小(1個位元組),int型別定義的指標就拿了int型別的大小(4個位元組)
&esmp;&esmp;以上就是對於指標的最基本的理解,明白這兩個點對於指標的理解來說非常重要,當然實踐才能出真知,要想更好的瞭解指標,還是得自己去實際的實驗嘗試。