詳解:C語言中的指針和p, p+1, *(p+1), *P+1, p[0], &p[0] 的含義

解析:C語言中的指針和p, p+1, *(p+1), *P+1, p[0], &p[0] 每一種表達式的含義

 一、先解決一個問題:什麼是指針
指針就是存放地址的變量。很好,百度上就是這個答案(哈哈,感覺這句話很廢話)。
指針是一個大小固定爲4個byte的變量,不管是什麼類型的指針大小都是固定的,因爲存放是一個地址信息。
void main()  
{
	int a = 1;
	char b = 'a';
	int* i = &a;//指向一個int值變量
	char* c = &b;//指向一個char值變量		
}

從上面的程序中可以看出來,定義一個int類型的指針和char類型的指針,但它們的大小都是4byte,因爲存放的是對應類型變量的地址而不是對應類型變量的內容。

二、指針P與指針P+1

void main()  
{  
      int a[] = {1,2,3,4};
      int* b = (int*)&a;
}


在上面的程序中定義一個int類型的指針(在這裏要重點強調一下,這裏是int類型的指針,對後面的內容的理解很重要),指針b的地址爲0x0018ff38,指針b+1的地址爲0x008ff3c,他們中間相隔了4byte,剛好是一個int類型的大小,而指針b又是一個int類型的指針,所以我們可以得出一個結論:

指針P+1 = 指針P + sizeof(指針的類型) *  1

三、數組和指針(剛好看到上面程序結果想到的一個點)

在上面的運行結果中,我們可以發現a[1]和*(p+1)得到的值是一樣的,因爲&a[1]指向的地址和P+1指向的地址是一致。

在C語言中獲得數組的值有兩種方法:

第一種:匿名方法   --> a[1]

第二種:具名+匿名方法  --> P + sizeof(數組類型)*1

四、*(P+1)和*P+1的不同之處

void main()  
{  
      int a[] = {1,4,3,4};
      int* p = (int*)&a;
}

其實這個問題很簡單,因爲*的優先級比+的優先級高,所以*P+1在編譯器中是先取出p指向的int值然後加1,就是a[0]+1,也就是1+1,所以*p+1取出的值等於2。而*(P+1),因爲多了一個括號,所以就變成指針P+1後,再取出裏面的值,也就是a[1]的中的值,所以*(P+1)取出的值等於4。

五、*(P+1)和P[1]

也是用上面的程序,我直接上運行結果,一看就知道了


這大概是寫法不同把,我個人的理解應該是跟上面第三點的兩種取值方法原理相似。我做了以下的嘗試

void main()  
{  
      int a[] = {1,4,3,4};
}

可以正常運行,沒有報錯,這裏就證明我的一個猜想,定義一個int類型的數組a,可以直接把a當做一個指向數組a首地址的int類型的指針使用。這就是說,定義一個int數組其實編譯器內部開闢一個內存塊和指向首地址int類型的指針給我們。

到這裏,最後一個&P[0]的含義就很明顯了,可以看成取數組第一元素的地址。


文章很多地址均爲本人用例子嘗試後得到的結論,可能不是很正確,如果您發現有錯誤的地方,請在評論中指出,以免誤導其它人,本人不勝感激。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章