1、C语言程序设计基础主讲人:庞新苗手机:13560715936第十八讲:指针(1)指针变量主要内容:主要内容:1、指针变量的定义和引用;、指针变量的定义和引用;2、指针变量作为函数参数;、指针变量作为函数参数;一、指针变量例:利用指针变量访问整型、实型、字符型变量。例:利用指针变量访问整型、实型、字符型变量。main()int num_int=12,*p_int;/*定义一个指向定义一个指向int型数据的指针变量型数据的指针变量p_int*/float num_f=3.14,*p_f;/*定义一个指向定义一个指向float型数据的指针变量型数据的指针变量p_f*/char num_ch=p,*p
2、_ch;/*定义一个指向定义一个指向char型数据的指针变量型数据的指针变量p_ch*/p_int=&num_int;/*取变量取变量num_int的地址,赋值给的地址,赋值给p_int*/p_f=&num_f;/*取变量取变量num_f的地址,赋值给的地址,赋值给p_f*/p_ch=&num_ch;/*取变量取变量num_ch的地址,赋值给的地址,赋值给p_ch*/printf(num_int=%d,*p_int=%dn,num_int,*p_int);/*符号符号*p_int用来访问用来访问p_int指向的地址空间的数据指向的地址空间的数据*/printf(num_f=%4.2f,*p_f
3、=%4.2fn,num_f,*p_f);printf(num_ch=%c,*p_ch=%cn,num_ch,*p_ch);1、指针的概念:、指针的概念:内内存存是是以以一一个个字字节节为为单单位位的的连连续续的的存存储储空空间间,每个内存每个内存单单元都有一个元都有一个编编号,称号,称为为内存地址。内存地址。请看下图,变量请看下图,变量i的地址是的地址是1000,变量,变量 i的内容是的内容是30。301000i 用另一个变量记住用另一个变量记住i的地址,这个变量的地址,这个变量就是指针类型的变量,一般称为指针变量。就是指针类型的变量,一般称为指针变量。因此,一个指针变量的值就是某个内存单因此
4、,一个指针变量的值就是某个内存单元的地址,称为某内存单元的指针。元的地址,称为某内存单元的指针。301000i1000p 用用p变量记住了变量记住了i的地址,的地址,p的数据类的数据类型就是指针类型。型就是指针类型。2、指针变量的定义:、指针变量的定义:指针变量的定义格式:指针变量的定义格式:指指针针所所指指对对象象的的数数据据类类型型 *指指针针变变量量名名1,*指指针针变变量量名名2,;定义格式中的定义格式中的“*”表示变量是一个指针变量。表示变量是一个指针变量。int*p;表示表示p是一个指针变量,是一个指针变量,p指向的存指向的存储单元是整型的。储单元是整型的。注意,注意,指针变量与其
5、他变量一样,如果是指针变量与其他变量一样,如果是自动变量并且未赋值,指针变量的值将是不定自动变量并且未赋值,指针变量的值将是不定值。如果想让值。如果想让p p的内容是的内容是i i的地址,需要做一个的地址,需要做一个取地址运算。取地址运算。定义指针的目的是为了通过指针去访问内存单元。定义指针的目的是为了通过指针去访问内存单元。运算符运算符“*”写在指针变量的前面,就是通写在指针变量的前面,就是通过该指针访问它所指向的存储单元。我们在上过该指针访问它所指向的存储单元。我们在上面三条语句后面,再加上一条执行语句,变成:面三条语句后面,再加上一条执行语句,变成:int i;/*定义整型变量定义整型变
6、量i */int*p;/*定义指针变量定义指针变量p */p=&i;/*p指向指向i */*p=3;/*使使i的内容为的内容为3 */最后一句是将最后一句是将p指向的存储单元指向的存储单元i的内容赋值为的内容赋值为3。3、指针和指针变量:、指针和指针变量:.2000200420062005整型变量i10变量i_pointer200120022003指针:一个变量的地址指针变量:专门存放变量地址的变量叫2000指针指针变量 变量的内容 变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量&与与*运算符运算符含义含义含义含义:取变量的地址取变量的地址单目运算符单目运算符优先级优先级:2
7、结合性结合性:自右向左自右向左含义含义:取指针所指向变量的内容取指针所指向变量的内容单目运算符单目运算符优先级优先级:2结合性结合性:自右向左自右向左两者关系:互为两者关系:互为逆运算逆运算理解理解.2000200420062005整型变量整型变量i10变量变量i_pointer2001200220032000指针变量指针变量i_pointer-指针变量,它的内容是地址量指针变量,它的内容是地址量*i_pointer-指针的指针的目标变量目标变量,它的内容是数据,它的内容是数据&i_pointer-指针变量占用内存的地址指针变量占用内存的地址200010i_pointer*i_pointer&
8、i_pointerii_pointer&i&(*i_pointer)i *i_pointer *(&i)i_pointer =&i =&(*i_pointer)i =*i_pointer =*(&i)指针变量指针变量指针变量指针变量与其与其所指向的变量所指向的变量之间的关系之间的关系指针变量的定义一般形式:存储类型 数据类型 *指针名;3变量变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33变量变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointe
9、r=3合法标识符合法标识符指针变量本身的存储类型指针变量本身的存储类型指针的目标变量的数据类型指针的目标变量的数据类型表示定义指针变量表示定义指针变量不是不是*运算符运算符例例 int*p1,*p2;float *q;static char *name;注意:注意:1、int *p1,*p2;与与 int *p1,p2;2、指针变量名是指针变量名是p1,p2,不是不是*p1,*p23、指针变量只能指向定义时所规定类型的变量指针变量只能指向定义时所规定类型的变量4、指针变量定义后,、指针变量定义后,变量值不确定变量值不确定,应用前必须先赋值,应用前必须先赋值指针变量的初始化指针变量的初始化一般形
10、式:一般形式:存储类型存储类型 数据类型数据类型 *指针名指针名=初始地址值;初始地址值;赋给指针变量,赋给指针变量,不是赋给目标变量不是赋给目标变量例例 int i;int *p=&i;变量必须已说明过变量必须已说明过类型应一致类型应一致例例 int *p=&i;int i;例例 int i;int *p=&i;int *q=p;用已初始化指针变量作初值用已初始化指针变量作初值例例 main()int i;static int *p=&i;.()不能用不能用autoauto变量的地址变量的地址去初始化去初始化staticstatic型指针型指针例例 main()int i=10;int *p
11、;*p=i;printf(“%d”,*p);危险!危险!例例 main()int i=10,k;int *p;p=&k;*p=i;printf(“%d”,*p);指针变量必须指针变量必须先赋值先赋值,再使用再使用.2000200420062005整型变量整型变量i10指针变量指针变量p200120022003随机随机零指针与空类型指针零指针与空类型指针零指针:零指针:(空指针空指针)定义定义:指针变量值为零指针变量值为零表示:表示:int *p=0;p p指向地址为指向地址为0 0的单元的单元,系统保证该单元不作它用系统保证该单元不作它用表示指针变量值表示指针变量值没有意义没有意义#defin
12、e NULL 0int *p=NULL:p=NULL与未对与未对p赋值不同赋值不同用途用途:避免指针变量的非法引用避免指针变量的非法引用在程序中常作为在程序中常作为状态状态比较比较 例例 int *p;.while(p!=NULL).void *类型指针类型指针表示表示:void *p;使用时要进行使用时要进行强制类型转换强制类型转换例例 char *p1;void *p2;p1=(char *)p2;p2=(void*)p1;表示不指定表示不指定p p是指向哪一种是指向哪一种类型数据的指针变类型数据的指针变量量4、指针的引用、指针的引用main()int a;int*pa=&a;a=10;p
13、rintf(a:%dn,a);printf(*pa:%dn,*pa);printf(&a:%x(hex)n,&a);printf(pa:%x(hex)n,pa);printf(&pa:%x(hex)n,&pa);运行结果:运行结果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex).f86f8af8cf8b整型变量整型变量a10指针变量指针变量paf87f88f89f86例例 输入两个数,并使其从大到小输出输入两个数,并使其从大到小输出main()int*p1,*p2,*p,a,b;scanf(%d,%d,&a,&b);p1=&a;p2=&b;if(ab)
14、p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%dn,*p1,*p2);运行结果:运行结果:a=5,b=9 max=9,min=5.指针变量指针变量p1 指针变量指针变量p20002008200220042006 指针变量指针变量p2 整型变量整型变量b 整型变量整型变量a5200692008200620082006二、指针变量作为函数参数二、指针变量作为函数参数地址传递地址传递特点:特点:共享内存共享内存,“双向双向”传递传递swap(int x,int y)int temp;temp=x;x=y;y=temp;main()
15、int a,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(n%d,%dn,a,b);例例 将数从大到小输出将数从大到小输出.20002008200A2002200420065变量变量a 变量变量b(main)9 变量temp 变量y 变量x(swap)559 59COPY二、指针变量作为函数参数地址传递 特点:特点:共享内存共享内存,“双向双向”传递传递swap(int x,int y)int temp;temp=x;x=y;y=temp;main()int a,b;scanf(%d,%d,&a,&b);if(ab)swap(a,b);printf(n
16、%d,%dn,a,b);例例 将数从大到小输出将数从大到小输出值传递值传递.20002008200A2002200420065变量变量a 变量变量b(main)9运行结果:运行结果:5,9swap(int *p1,int *p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a,b;int*pointer_1,*pointer_2;scanf(%d,%d,&a,&b);pointer_1=&a;pointer_2=&b;if(ab)swap(pointer_1,pointer_2);printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型变量整型变量a 整型变量整型变量b(main)指针指针pointer_1指针指针pointer_220002002(swap)指针指针p1指针指针p2整型整型p5920002002COPY5例例 将数从大到小输出将数从大到小输出作业作业(237)输入三个数,利用指针的知识求输入的三个输入三个数,利用指针的知识求输入的三个术的最大值和最小值。术的最大值和最小值。