黑马程序员——C语言日志——指针、地址和变量值

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


这篇文章主要讲述如何利用地址存取变量值。我们知道,指针变量存储的是变量的地址,通过指针可以存取变量的值,下面看一个简单地例子:

#include"stdio.h"
#include"stdlib.h" 
void main()
{  int m=7,re;                //定义变量m
   int *a=&m;               //定义指针a,并将m的地址赋予a
   re = *a;                 //读取m的值
   *a=8;                    //改变a所指向的地址内的值
   printf("%d,%d\n",re,m);           //打印 
    system("pause") ;             //DOS窗口停留  
}
打印:7,8      

上面这段程序中将变量m的地址存在了指针变量a中,通过*a读取和改变了m中的值,那么我们现在看看指针变量中存的这个地址具体是什么值,通过下面这段代码,我们打印出m的地址

#include"stdio.h"
#include"stdlib.h" 
void main()
{  int m=7;                //定义变量m
   int *a=&m;               //定义指针a,并将m的地址赋予a
   //*a=8;                    //改变a所指向的地址内的值
   printf("%X\n",a);           //以十六进制格式符打印 
   printf("%p\n",a);           //以指针格式符打印
    system("pause") ;             //DOS窗口停留  
}
打印结果:12FF7C

                     0012FF7C

都为十六进制数据0X12FF7C,那么既然知道指针变量里面存储的值,也就是变量m的地址,那么我们怎么利用这个 地址直接存取其中的值呢?

</pre><pre name="code" class="cpp">#include"stdio.h"
#include"stdlib.h" 
void main()
{  int m=7,re;                 //定义变量m
   int *a=&m;                  //定义指针a,并将m的地址赋予a
   re = *(int*)0X12FF7C;       //读取改地址中的值,也就是m的值
   *(int*)0X12FF7C = 8;        //改变地址内的值,也就是m的值
   printf("%d,%d\n",re,m);     //打印re,m
    system("pause") ;          //DOS窗口停留  
}

打印结果:7,8

那么我们成功利用这个地址数据读取和改变了这个地址中的值,下面来分析一下这两行代码

re = *(int*)0X12FF7C;       //读取改地址中的值,也就是m的值
   *(int*)0X12FF7C = 8;        //改变地址内的值,也就是m的值

0X12FF7C只是一个整型数据,而指针变量a中存储的是整型的指针类型的数据(int*),所以需要将0X12FF7C这个整型数据先强制转化为int*,(int*)0X12FF7C,这样一来,指针变量a==(int*)0X12FF7C,*a==*(int*)0X12FF7C,所以,上面这两行代码就跟下面这两行代码是等价的:

 re = *a;                 //读取m的值
   *a=8;                    //改变a所指向的地址内的值
好了,今天就到这里,希望读者看过这篇文章之后,能够更好地理解指针的含义。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值