1. 程式人生 > >【C語言】菜鳥的指標入門

【C語言】菜鳥的指標入門

        一直以來,指標都是我在C語言部分的一大硬傷,因為當初基礎概念弄不清楚,導致後來的聽課如同聽天書。今天,老師幫我們重新梳理了指標的相關知識,雖然只是一些概念性的,由於時間關係沒有深入講解,但這次我好像對指標瞭解一些了,以下是我的收穫。

理解指標:

    對於int * p來說:

指標的內容—— 別人的地址

指標的地址—— &p

指標指向的內容—— *p

理解指標型別:

為了方便理解指標型別,我們要明白C語言中各變數型別在記憶體中佔的位元組數?

Char——1KB       Short——2KB   int——4KB     long——4KB

float——4KB       

double——8KB

   那麼加了指標以後,不同指標型別的輸出結果又是什麼呢?

        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