【C語言】菜鳥的指標入門
阿新 • • 發佈:2019-02-15
一直以來,指標都是我在C語言部分的一大硬傷,因為當初基礎概念弄不清楚,導致後來的聽課如同聽天書。今天,老師幫我們重新梳理了指標的相關知識,雖然只是一些概念性的,由於時間關係沒有深入講解,但這次我好像對指標瞭解一些了,以下是我的收穫。
理解指標:
對於int * p來說:
指標的內容—— 別人的地址
指標的地址—— &p
指標指向的內容—— *p
理解指標型別:
為了方便理解指標型別,我們要明白C語言中各變數型別在記憶體中佔的位元組數?
Char——1KB Short——2KB int——4KB long——4KB
float——4KB
那麼加了指標以後,不同指標型別的輸出結果又是什麼呢?
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
根據結果,我們可以知道,不論是什麼指標型別,在32位平臺下永遠只佔4個位元組,在64位平臺下佔8個位元組。
那麼有一個問題,既然指標型別佔的位元組數相同,為什麼還要這麼多種指標型別呢?不能用一種指標型別表示所有嗎?
其實這些指標型別並非無用,它們不僅在解引用操作時能夠決定訪問位元組大小的許可權,而且還在指標運算(加/減)的過程中起到了作用
具體有以下示例:
int num = 0x11223344; //在記憶體中儲存為 44 33 22 11 char *p = # p = p1+1; //因為char型一次訪問1個位元組,現在我們想訪問第二個位元組 *p = 0x55; //解引用,修改此位元組值為55,num = 0x11 22 55 44 p = p1-1; //同樣,訪問第一個位元組 *p = 0x66; //修改此位元組為66,num = 0x11 22 55 66 int *p1 = # //int型一次訪問4個位元組 int *p2 = # *p1 = 55; //解引用,則此時num = 0x00 00 00 37 *p2 = 0x55; //num = 0x00 00 00 55