您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > C语言学习文档第08章指针(培训)
第8章指针8.1变量的地址和指针2.数据在内存中的存储方式:按数据类型在内存为其分配一定数量的存储单元(字节)。1.内存单元的地址:计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号就称为内存地址3.内存单元的内容:即变量的值。例如有定义:shortinta,b;charc;floatx;变量a,b,c,x的内存分配情况:abxc200020012002200320042005200620072008每个变量的地址是指该变量所占存储单元的第一个字节的地址,称为指针。4.计算机中数据存取方式A、变量的“直接访问”方式:按变量的地址存取变量值的方式。(见下图)i20003直接访问:编译器自动完成3i20002000pointer间接访问方式示意图:将变量的地址放在另一个特殊的变量中,先到另一个变量所表示的存储单元中取得变量的地址,再由变量的地址找到变量并进行数据存取(见下图)。b.变量的“间接访问”方式变量pointer为指针变量,存放的是变量i的内存地址,我们说pointer指向i。6.指针的概念:一个变量的首地址称为该变量的指针。用来专门存储变量指针的变量称为指针变量。8.2指针与变量一.指针变量的定义1.定义方式:类型标识符*指针变量名1,*指针变量名2……;例:float*p1;(定义了p1为指向实型变量的指针变量)char*p2;(定义了p2为指向字符型变量的指针变量)标识符前面的“*”,表示该变量为指针变量。但指针变量名是*后面的名字(不包括“*”)。3.说明2.指针变量的三要素:指针变量的基类型:和其所指变量的类型一致;指针变量的值:另一个变量在内存的地址;指针变量的名字:符合用户标识符规则。指针变量名=某一地址;8.3.指针变量的赋值方式1:指针变量名=&变量名;方式2:指针变量名=另一已经赋值的指针变量;方式3:通过标准的库函数(malloc和calloc在内存中开辟动态存储单元)i的地址pi的值iqi的地址例如:inti,*p,*q;p=&i;/*方式1*/q=p;/*方式2*/示意图说明:给指针变量赋“空”值除了给指针变量赋地址值外,还可以给指针变量赋NULL值。如:p=Null;Null是在stdio.h头文件中定义的预定义符。在使用前必须使用预定义行:#includestdio.h。Null的代码值为0,当执行以上赋值语句后,称p为空指针。等价于:p=‘\0’;或p=0注意:这时指针p不是指向地址为0的存储单元,而是一个具有一个确定的值“空”。企图通过一个空指针去访问一个存储单元,将会得到一个出错信息。国家等级考试练习1.已知inta=3,a的地址为1001,则&a=?10012.设有定义:floatx;则以下对指针变量p进行定义且赋初值的语句中正确的是:a)float*p=1024;b)int*p=(float)x;c)floatp=&xd)float*p=&xD4.有以下程序段#includestdio.hmain(){intn,*p=NULL;*p=&n;scanf(“%d”,&p);printf(“%d\n”,p);}该程序试图通过P为变量n读入数据并输出,但程序有多出错误,以下语句正确的是:a.intn,*p=NULLb.*p=&nc.scanf(“%d”,&p)d.printf(“%d\n”,p);A8.4.对指针变量的操作1.通过指针来引用一个存储单元C语言提供了一个称作“间接访问运算符”(间接运算符)的单目运算符:“*”,当指针变量有确切的地址值时,就可以通过间接访问运算符引用该地址指向的存储单元。如:int*p,i=10,j;p=&i;j=*p;说明:把p所指向的存储单元(i)的值赋给j,*p代表p所指向的变量i,以上语句等价于:j=i;分析以下表达式的含义:j=*(&i);j=*p+1;*p=100;*p+=1;++*p;(*p)++;int*p,i=10,j;p=&i;j=*p;例子:例8.12.算术运算(移动指针)例如:int*p,i;char*q,c;p=&i;q=&c;…...i10001001100220002001cpq…...i10001001100220002001cpq/*运算示例*/p++;q++;对指针进行加减运算时,数字“1”不代表十进制整数“1”,即不是移动一个字节,而是移动一个存储单元长度。例如:右图1pq为假。…...i10001001100220002001cpq…...400040014002400340184019pqa[0]a[1]a[9]例如:右图2inta[10];int*p,*q;p=&a[0];/*或p=a;*/q=&a[9];/*或q=a+9;*/求pq,pq为真为假?2.比较运算[例]main(){inta,b;int*pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b;printf(%d,%d\n,a,b);printf(%d,%d\n,*pointer_1,*pointer_2);}程序运行结果:100,10100,10思考:1.若已执行了“pointer_1=&a”,则:“&*pointer_1”的含意是什么?(答:相当于&a)2.*&a的含意是什么?(答:a)3.(*pointer_1)++相当于什么?(答:a++)[例]对输入的两个整数按大小顺序输出main(){int*p1,*p2,*p,a,b;a=5;b=9;p1=&a;p2=&b;①&a59p1p2&bab(1初始)2执行p=p1后&a5p1a&b9p2b&apif(ab){p=p1;②p1=p2;③p2=p;}④printf(a=%d,b=%d\n,a,b);printf(max=%d,min=%d\n,*p1,*p2);}&b&b3执行p2=p1后&ap9p1p25ab4执行p2=p后5&a&b&a9pp1p2ab------指向指针变量的指针.定义形式:类型**变量名;例如:inti,*p,**q;i=30;p=&i;q=&p;100020001000100120003000ipq内存示意图:指针的指针国家等级考试练习:1.设有定义:intn1=0,n2,*p=&n2,*q=&n1,以下赋值语句中与n2=n1;语句等价的是:a.*p=*q;b.p=qc.*p=&n1d.p=*qA2.若有说明语句:double*p,a;则能通过scanf语句正确给输入项读入数据的程序段是:a.*p=&a;scanf(“%lf”,p);b.*p=&a;scanf(“%f”,p);c.p=&a;scanf(“%lf”,*p);d.p=&a;scanf(“%lf”,p);D3.已定义以下函数intfun(int*p){return*p;}fun函数的返回值是:a.不确定的值b.一个整数c.形参p中存放的值d.形参p的地址值B8.5函数之间的地址值传递1.形参为指针变量时实参和形参之间的数据传递若函数的形参为指针类型,调用该函数时,对应的实参必须是基类型相同的地址值或者是已指向某个存储单元的指针变量。例.编写函数myadd(int*a,int*b),函数中把指针a和b所指向的存储单元中两个值相加,然后将和的值作为函数值返回。#includestdio.hintmyadd(int*a,int*b){intsum;sum=*a+*b;returnsum;}main(){intx,y,z;printf(“enterx,y:”);scanf(“%d%d”,&x,&y);z=myadd(&x,&y);printf(“%d+%d=%d\n”,x,y,z);}思考:如果在被调函数中改变形参的值将如何呢?2.通过传送地址值在被调用函数中直接改变调用函数中变量的值#include“stdio.h”Voidswap(int*,int*);Voidmain(){intx=30,y=20;printf(“(1)x=%dy=%d\n”,x,y);Swap(&x,&y);printf(“(4)x=%dy=%d\n”,x,y);}Voidswap(int*a,int*b){intt;printf(“(2)a=%db=%d\n”,*a,*b);t=*a;*a=*b;*b=t;printf(“(3)a=%db=%d\n”,*a,*b);}输出结果:(1)x=30y=20(2)a=30b=20(3)a=20b=30(4)x=20y=30例:8.4voidswap(int*x1,int*x2)voidorder(int*a,int*b)3.指针函数(函数返回地址值)1.一个函数可以带回整型值、实型值、字符型值,也可以带回指针类型的数据,即地址。返回值是指针类型的函数,称为指针函数。2.一般定义形式为:类型标识符*函数名(参数表);例如:int*a(intx,floaty){……}3.说明对于定义:int*a(intx,floaty){……}a是函数名,调用它后能得到一个指向整型数据的指针(地址)。x,y是函数a的形参。这个函数前面有一个*,表示此函数是指针类型函数(函数值是指针)。main(){inta,b,*p;int*max();scanf(“%d,%d”,&a,&b);p=max(a,b);printf(“max=%d”,*p);}[指针函数应用举例]int*max(intx,inty){if(xy)return(&x);elsereturn(&y);}国家等级考试练习:1.以下叙述中错误的是:a.改变函数形参的值,不会改变对应的实参b.函数可以返回地址值c.可以给指针变量赋一个整数作为地址值d.当在函数的开头中包括头文件stdio.h时,可以给变量赋NULLC
本文标题:C语言学习文档第08章指针(培训)
链接地址:https://www.777doc.com/doc-957569 .html