本帖最后由 洪吉童 于 2015-9-28 23:02 编辑
这篇文章主要讲述如何利用地址存取变量值。我们知道,指针变量存储的是变量的地址,通过指针可以存取变量的值,下面看一个简单地例子:
[cpp] view plaincopy
- #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的地址
[cpp] view plaincopy
- #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的地址,那么我们怎么利用这个 地址直接存取其中的值呢?
[cpp] view plaincopy
- #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
那么我们成功利用这个地址数据读取和改变了这个地址中的值,下面来分析一下这两行代码
[cpp] view plaincopy
- re = *(int*)0X12FF7C; //读取改地址中的值,也就是m的值
- *(int*)0X12FF7C = 8; //改变地址内的值,也就是m的值
0X12FF7C只是一个整型数据,而指针变量a中存储的是整型的指针类型的数据(int*),所以需要将0X12FF7C这个整型数据先强制转化为int*,(int*)0X12FF7C,这样一来,指针变量a==(int*)0X12FF7C,*a==*(int*)0X12FF7C,所以,上面这两行代码就跟下面这两行代码是等价的:
[cpp] view plaincopy
- re = *a; //读取m的值
- *a=8; //改变a所指向的地址内的值
好了,今天就到这里,希望读者看过这篇文章之后,能够更好地理解指针的含义。
来自本人博客http://blog.csdn.net/hongjitong2/article/details/48791093
|