漫谈(二)对”C“语言的理解,“不看后悔一辈子”

指针作为一种引入类型。不同的表示方式到底有什么区别?

比如:double *、float*、int * 、char *、void *等;

不管是指向 double的指针,还是指向int的指针。其实都是一种指针类型,在某种意义没有任何区别。在这里,说一下相同点和不同点。

这时候便想起“指针就是地址”,这句话貌似也是正确的了。

#include <stdio.h>


int main(void)
{
   int *p;
   float *q;
   double *t;
   void *hope;

   char i = 10;

   printf("p->    = %p\n",p);
   printf("q->    = %p\n",q);
   printf("t->    = %p\n",t);
   printf("hope-> = %p\n",hope);


   printf("&p    = %p\n",&p);
   printf("&q    = %p\n",&q);
   printf("&t    = %p\n",&t);
   printf("&hope = %p\n",&hope);

   return 0;
}

运行结果:

 

p->    = (nil)
q->    = 0x400680
t->    = 0x4004a0
hope-> = 0x7ffd9493b440

各个指针指向的值,基本上都是无效值,或者说是些垃圾数据。


&p    = 0x7ffd9493b338
&q    = 0x7ffd9493b340
&t    = 0x7ffd9493b348
&hope = 0x7ffd9493b350

指针变量本身的地址。它们就是占用8个字节的指针变量,没有任何不一样的地方。

 

#include <stdio.h>


int main(void)
{
   int *p;
   float *q;
   double *t;
   void *hope;

   char i = 10;

   printf("p->    = %p\n",p);
   printf("q->    = %p\n",q);
   printf("t->    = %p\n",t);
   printf("hope-> = %p\n",hope);


   printf("&p    = %p\n",&p);
   printf("&q    = %p\n",&q);
   printf("&t    = %p\n",&t);
   printf("&hope = %p\n",&hope);

   printf("------------------------------------\n");
   printf("------------------------------------\n");


   p = &i;
   q = &i;
   t = &i;
   hope = &i;



   printf("p->    = %p\n",p);
   printf("q->    = %p\n",q);
   printf("t->    = %p\n",t);
   printf("hope-> = %p\n",hope);

   printf("&i     = %p\n",&i);


   printf("&p    = %p\n",&p);
   printf("&q    = %p\n",&q);
   printf("&t    = %p\n",&t);
   printf("&hope = %p\n",&hope);


   return 0;
}

运行结果为:(编译的时候会有警告,这里我们先不要关注它)

p->          = (nil)
q->          = 0x4007a0
t->           = 0x4004e0
hope->    = 0x7ffc617fcf20
&p           = 0x7ffc617fce18
&q           = 0x7ffc617fce20
&t            = 0x7ffc617fce28
&hope     = 0x7ffc617fce30
------------------------------------
------------------------------------
p->         = 0x7ffc617fce17
q->         = 0x7ffc617fce17
t->          = 0x7ffc617fce17
hope->   = 0x7ffc617fce17

&i           = 0x7ffc617fce17

&p          = 0x7ffc617fce18
&q          = 0x7ffc617fce20
&t           = 0x7ffc617fce28
&hope    = 0x7ffc617fce30

 

结果说明无论哪种类型的指针变量,都可以指向i。这里的*p、*q、*t、*hope的值也就都是10。这里就验证了那句话,“指针变量本身的地址。它们就是占用8个字节的指针变量,没有任何不一样的地方。”

以上标蓝色的地址为什么会和程序一不一样。因为在计算机中变量是随机分配的,所以程序二和程序一变量是不相同的。

总结:在指针编程中,一定要把所有的精力放到内存上去,而不是变量本身。

 

那么为什么不写成一样呢?为什么char和int类型会区别那么大呢?它们之间到底有什么玄机?

这里先卖个关子。想听继续分解,请见下篇博文。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值