請看我寫的如下代碼:
#include&
int main()
{
int value = 1;
int* ptr = value; // *ptr = value
printf("%d
", value); //輸出值 |
printf("%d
", *ptr); //輸出值 |
printf("%p
", value); //輸出地址 |
printf("%p
", ptr); //輸出地址 |
printf("%d
", *ptr == value); //ture *ptr == value
printf("%d
", ptr == value); //true
/*
*/
return 0;
}
從輸出的情況可以看出ptr是value的地址也即value,而*ptr代表value的值。即ptr == value,而*ptr == value。
可是在賦值的時候是*ptr = value,那麼*ptr應該與value等價才對,可在使用時兩者並不等價(見上)。這種賦值語句的寫法雖然不影響我正常地使用指針編寫程序,但對於我這種有強迫症的人來說這種賦值語法顯得很擰巴,並且有一定的誤導性。
所以從底層實現上來說這段代碼是怎樣被編譯的呢?指針是*ptr還是ptr呢?謝謝!
嗯哼,你問到了指針這個東西,最容易迷惑人的一個地方。
int* ptr = value;
這一行是聲明的語法,是規定出來的,即聲明ptr是一個指針,同時ptr= value
這跟平時使用這個指針的時候,賦值 *ptr = value 不是一回事。
所以你才會有這個疑問。說穿了不值一提。
你其他理解都是對的
在題主的代碼中可以看到int* ptr、value、value、*ptr、ptr、 *ptr == value)、ptr == value等寫法,是不是看上去眼花繚亂、傻傻搞不清楚?其實啊,與其花費大精力給你解釋什麼「地址」、「指針」、「指向」等這些費解的抽象的概念,還不如用我發明的「己他」概念來解釋這個問題。
- ptr和value就是ptr的己值
- *ptr就是ptr的他值
- value就是ptr的他值
從2和3就可以得知,*ptr就是value,都是他值;ptr就是value,都是己值,所以用我的「己他」法一句話就解釋完畢,一句話你就能理解,還費啥勁兒再去解釋什麼地址不地址的!
關於指針的「己他」文章在我的圈子「C語言解惑課堂」從【第104篇】開始有講,題主有興趣的話可以在我的微信公眾號「C語言編程技術分享」的主頁回復「1111」加入圈子,從【第104篇】開始查看,也可以回復「1112」查看圈子所有的C語言答疑文章。