指针变量是一个特殊的变量,它用于存储其它变量或程序对象的内存地址。声明指针变量后,开发者可以使用“”运算符取出其它变量的内存地址,赋值给指针变量。
例如:
inta=20;
int*p;
p=a;
代码段声明了整型变量a和指针变量p,整型变量a初始化为20,指针变量p在声明时没有初始化,当前p的值为随机的内存地址,p在初始化之前是不能被使用的,否则会出现意想不到的错误。代码段的第3条语句使用“”运算符取出变量a的内存地址,赋值给指针变量p,此时指针变量p的值为变量a的内存地址。下图描述了指针变量和变量a的关系。
“”运算符用于取出变量或程序对象的内存地址,它是一个单目运算符,返回操作数的内存地址,可以赋值给类型合适的指针。
指针变量p被赋值后,它存储了变量a的内存地址,当前p和变量a都指向了同一内存地址,下面的赋值语句是效果相同的代码:
inttemp;
temp=a;
temp=*p;
变量a赋值给temp,temp的值为20,我们重点看第2条赋值语句,*p是取出指针变量p指向的内存地址中保存的数据,因为p保存了变量a的内存地址,因此相当于把变量a再次赋值给了temp。
“*”运算符也是单目运算符,用于获取给定地址(指针变量保存的内存地址)中保存的数据。“”和“*”运算符与其它单目运算符的优先级相同,自右向左结合。
使用“*”运算符也可以把数据保存到指针变量指向的内存地址。例如:
*p=20;
指针变量p指向的内存地址保存的数据为20.
例指针变量的间接赋值
编程要求:声明一个整数变量x,一个整数类型的指针变量p,取出变量x的地址赋值给指针变量p,将整数20保存到p指向的内存地址,输出变量a的值。
程序清单sample.c
#includestdio.h
voidmain()
{
intx;
//变量x的内存地址赋值给指针变量p
int*p=x;
//整数20保存到p指向的内存地址
//*p=20等价于x=20
*p=20;
//输出x的值
printf("x=%d",x);
}
案例7-1演示了指针变量间接给变量x赋值的作用,指针变量p的值为变量x的内存地址,*p=20语句将整数20赋值给p指向的内存地址,p指向的内存地址即为变量x的内存地址,因此变量x被赋值为20。
例指针变量参与运算
编程要求分别声明浮点变量x和y并初始化,声明两个浮点类型的指针变量px和py,变量x的地址赋值给px,变量y的地址赋值给py,使用px和py计算变量x和y的乘积,乘积结果赋值一变量,并输出该变量的结果。
程序清单sample.c
#includestdio.h
voidmain()
{
floatx=3.1,y=2.6;
//变量x和y的内存地址赋值给指针变量px和py
float*px=x,*py=y;
//计算*px和*px的乘积
floatresult=*px**py;
//输出x的值
printf("x*y=%.2f",result);
}
案例7-2演示了指针变量取值和参与运算的使用方法,*px是取出px指向内存地址的数据,因为px指向变量x的内存地址,因此*px取出的数据为3.1,同理*py取出的数据为2.6.
小结:当一个指针变量和变量A的内存地址绑定后,这个指针变量实际就是变量A的一个引用,对指针变量的赋值和取值操作都是针对变量A进行的。