------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
打印结果:7,8
这篇文章主要讲述如何利用地址存取变量值。我们知道,指针变量存储的是变量的地址,通过指针可以存取变量的值,下面看一个简单地例子:
#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所指向的地址内的值
好了,今天就到这里,希望读者看过这篇文章之后,能够更好地理解指针的含义。