1.首先写一个取元素地址的代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
a=10;
int *p;
p=&a;
printf("a的地址是:%p\n",p);
system("pause");
return 0;
}
运行结果:
这里a的地址是系统随机分配的
2.能不能让a(10),强制保存在我要的地址
在0x0060ff00 地址当中存放一个10
(强制在一个地址当中写入自己想写入的数据)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a;
a=10;
int *p;
p=&a;
printf("a的地址是:%p\n",p);
int *p2=(int *) 0x0060ff00;
//把16进制的地址强制转换成整型
//这里当中的p2指向地址
*p2=10;
printf("在内存的%p位置,存放值是%d\n",p2,*p2);
system("pause");
return 0;
}
运行结果:
3.volatile引入
寄存器比内存更靠近CPU,所以寄存器访问数据的速度比内存访问的速度更快。
引入volatile:
目前写的程序都是单线程
例如对a进行访问,将a拷贝一份给寄存器,换句话说,将内存int a=10;拷贝一份给寄存器,下一次CPU对a进行访问的时候,不从内存访问,直接在寄存器中执行,这样的访问速度就快了许多;如果把a的值发生改变,a=11,自动的把11这个数据,更新到寄存器当中。
volatile的正规说法(引入一篇CSDN的博文当中的一段话)
在本次线程内,当读取一个变量时,为了提高读取速度,编译器进行优化时有时会先把变量读取到一个寄存器中;以后,再读取变量值时,就直接从寄存器中读取;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以保持一致。
当变量因别的线程值发生改变,上面寄存器的值不会相应 改变,从而造成应用程序读取的值和实际的变量值不一致。
当寄存器因别的线程改变了值,原变量的值也不会改变,也会造成应用程序读取的值和实际的变量值不一致。
——@上官可编程