解析: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]的含義就很明顯了,可以看成取數組第一元素的地址。
文章很多地址均爲本人用例子嘗試後得到的結論,可能不是很正確,如果您發現有錯誤的地方,請在評論中指出,以免誤導其它人,本人不勝感激。