赞
踩
由上一节,我们知道了,指针就是地址,而变量的指针就是变量的地址,存放变量地址的变量就是指针变量。指针变量可以指向另一个变量,在程序中使用" * "来表示这种指向关系。
1.指针变量的定义
指针的定义依然遵循先定义后使用的原则,在使用前必须先定义,指定其类型编译器再据此为其分配内存单元。
定义指针变量的一般格式:
类型标识符 * 指针变量名
例如:int *p ; float *p; 分别是指向整形变量的指针变量p,指向浮点类型变量的指针变量q。
注意:定义指针变量时,类型标识符一旦确定就不能改变,如果定义了一个指向整型变量的指针变量,那么它就不能再指向其他类型的变量了。也就是说一个指针变量只能指向同一种类型的变量。
2.取地址运算符(&)
为了使用指针,c语言提供了两个特别的运算符——取地址运算符&和取值运算符*。
在定义了一个指针变量后,只为其分配了相应的内存单元用于存放指针的值,而这个指针变量并没有指向某个特定的变量,因此,在使用指针时,也需要将指针变量进行初始化,因为指针变量存放的是变量的地址,因此对指针初始化就是将某个变量的地址赋给它。
例如:
int x=5,*p; p=&x; (将x的地址赋给了指针变量p,那么指针变量p就指向了x)
程序中定义的变量和存储器中的存储单元相对应,变量名字和存储单元的地址对应,变量内容和存储单元中所存储的数据对应。
当然上述语句也可以写成 :
int x=5;
int *p=&x;还可以写成:
int x=5,*p=&x; 使用c语言编程时,每个变量都有变量名,还有变量存储的值。当程序被编译和加载后,变量名就变成了计算机内存中的地址,而变量的值就存放在该地址中或从该地址开始的连续几个内存单元中。因此,变量名和变量值实际上就是变量地址和地址中存放的值。
3.取值运算符(*)
如果指针变量指向了某个变量,那么就可以使用取值运算符*来访问变量中的内容。
例如
printf("%d\n",*p); 如果指针变量p指向整形变量x,那么就可以用下面的语句打印变量x的值。
4.指针变量的赋值
和其他变量一样,也可以使用赋值运算符为指针变量赋值,但要保证两个指针变量的类型相同。
假设有如下变量定义:
int i,j,*p,*q;
p=&i;
q=&j; 这两句将变量i和j的地址分别赋值给指针变量p和q;
当q=p时,这条语句就是将指针变量p的内容赋值给指针变量q,其结果如下图所示:
执行了q=p后,执行该条语句,指针变量p和q都指向了同一个变量i,因此指针变量p和q中存放的都是变量i的地址&i。变量i此时并没有初始化,只为其分配了内存单元。
注意理解:q=p;和*q=*p
前者为指针变量q赋值,即将指针变量p中存放的某个变量的地址赋值给q。显然,赋值后,q和p就指向了同一个变量。(赋值的内容是指针,也就是地址)
后者将p指向变量的赋值给q指向的变量。(赋值的内容是数值)
例子:
p=&i;
q=&j;
i=2;
j=3;对上面代码分别执行q=p;*q=*p;流程图如下图:
5.例子讲解
通过指针变量访问整形变量
#include
int main(){
int a=100,b=10;
int *pointer_1,*pointer_2;
pointer_1=&a;
pointer_2=&b;
printf("a=%d,b=%d\n",a,b);
printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2);
return 0;
}a=100,b=10*pointer_1=100,*pointer_2=10
程序分析:
(1)在开头处定义两个指针变量*pointer_1,*pointer_2。但此时它们并未指向任何一个变量,只是提供两个指针变量,规定它们可以指向整形变量,至于指向那个整形变量,要在程序中定义,程序中pointer_1指向a,pointer_2指向b,此时pointer_1的值就是&a,pointer_2的值就是&b。
(2)第8行输出*pointer_1,*pointer_2的值,其中*是取值符号,表示“指向变量”。所以它们的值分别就是a,b变量的值。
(3)程序中有两处*pointer_1,*pointer_2,第四行表示定义两个指针*pointer_1,*pointer_2,“*”只是表示该变量是个指针变量。最后一行的printf函数中*pointer_1,*pointer_2代表指针变量*pointer_1,*pointer_2所指向的变量。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。