请看我写的如下代码:
#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语言答疑文章。