漫谈(二)对”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类型会区别那么大呢?它们之间到底有什么玄机?

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


 

发布了64 篇原创文章 · 获赞 63 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq84395064/article/details/104618945
今日推荐