两个原因:
1、强制设置一个变量存放在一个地址
2、摆脱形参、实参
原因一:强制设置一个变量存放在一个地址
int a = 2;
int* b = (int *)0x0060FEEC;
*b = 20;
printf("a的地址%p\na的内容%d\n",&a,a);
printf("b的地址%p\nb的内容%d\n",b,*b);
用途:ARM裸机编程、ARM驱动编程
volatile int* b = (int *)0x0060FEEC;
volatile:
简易:可以保证每一次取数据都是在内存地址中取,虽然损失了时间,但可以保证每一次取出的数都是一致的,避免出现寄存器替换导致的变量值改变。
更完整:有些变量是用 volatile 关键字声明的。当两个线程都要用到某一个变量且该变量的值会被改变时,应该用 volatile 声明,该关键字的作用是防止优化编译器把变量从内存装入 CPU 寄存器中。如果变量被装入寄存器,那么两个线程有可能一个使用内存中的变量,一个使用寄存器中的变量,这会造成程序的错误执行。volatile 的意思是让编译器每次操作该变量时一定要从内存中真正取出,而不是使用已经存在寄存器中的值。volatile的作用
原因二:摆脱形参、实参
使用形参、实参:传入的是数
void swap(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1;
int b = 2;
printf("a=%d,b=%d\n",a,b);
swap(a,b);
printf("a=%d,b=%d",a,b);
system("pause");
return 0;
}
如果一定要使用形参和实参的方式:则可以通过设置全局变量来实现、或通过return 返回(可传回一个数组指针)
全局变量法简写:
int c = 0;//此为全局变量c
void swap(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
c = b;
}
int main()
{
int a = 1;
int b = 2;
printf("默认c=%d\n",c);
printf("a=%d,b=%d\n",a,b);
swap(a,b);
printf("a=%d,b=%d\n",a,b);
printf("经过swap的c=%d",c);
system("pause");
return 0;
}
使用指针:传入的是地址
void swap(int* a,int* b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int a = 1;
int b = 2;
printf("a=%d,b=%d\n",a,b);
swap(&a,&b);
printf("a=%d,b=%d",a,b);
system("pause");
return 0;
}