资源描述:
《C语言基础 九、指针》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、九、指针本章概述:本章主要考查指针和地址的概念,指针的定义及使用,指针和一维数组的关系,指针和二维数组的关系,指针和字符串的关系,指向函数的指针及返回值为指针的函数,指针变量作函数的参数,指针数组及指向指针的指针等。据对最近几年试卷分析得知,本章考核内容所占比例为15%左右,属重点考核内容,需重点理解。大纲要求:1.地址与指针变量的概念,地址运算符与间址运算符。2.一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。3.用指针作函数参数。4.返回地址值的函数
2、。5.指针数组,指向指针的指针。重点难点:1.一维、二维数组和字符串的地址以及指向变量、数组、字符串、函数、结构体的指针变量的定义。通过指针引用以上各类型数据。2.用指针作函数参数。考点1考点分析:地址、指针和指针变量计算机内存是一个连续编码的单元,每个存储单元都有一个固定的编号,这个编号就是地址。在C程序中定义变量,编译系统都会给这个变量分配相应的存储单元,变量的值放置在相应的内存单元中。C语言中的变量就代表了内存中的一些存储单元,该单元的固定编号就是变量的地址,也称为指针,因此变量的地址又称为变量的“指针”。专门用
3、来存放另一个变量的地址的变量,称为指针变量,又称为指向某个变量的指针。 在C语言中存在直接存取和间接存取两种访问内存数据的方法。直接存取利用变量名隐式地访问内存:首先定义变量,然后由编译系统完成从变量名到内存地址的映射工作,用户通过变量名访问内存空间,变量地址对用户完全透明。间接存取则通过指针显式地访问内存:用户直接使用变量的地址,或者将变量的地址值存储于指针变量中,然后通过指针变量获取地址值访问内存。 指针变量的定义:类型名 *指针变量名1,*指针变量名2,……;如:int*p,*q;,则定义了两个指针变量p和q,p
4、和q分别指向整型变量。但此时p和q并没有指向,若要使其有指向,则需要给它们赋值。如:intx,y;p=&x;q=&y;则p和q分别指向整型变量x和y,即指针变量p和q中分别存放整型变量x和y的地址。注意:指针变量的类型与它所指向的变量的类型应一致。指针变量中只能存放地址值,不可以将任何非地址类型的数据赋给指针变量。如:p=1000;这种赋值方式是非法的。地址值可以通过运算符“&”获取,地址中所存储的值可以通过运算符“*”间接获取。(1)取地址运算符“&”使用格式为:&变量名,如&a表示变量a在内存中的地址。本运算符实现
5、从变量到地址的转化。 (2)指针运算符“*”使用格式为:*指针变量名,如*p表示指针变量p所指向的变量的值。本运算符实现从地址到变量的转化。【特别提醒】:语句int*p;中,指针变量p表示的是地址,而*p表示的是地址中所存放的数据。l试题解析1.有以下程序#include#includeintfun(intn){int*p;p=(int*)malloc(sizeofi(int)) ;*p=n;return*p;}main(){inta;a=fun(10);printf(“%d
6、”,a+fun(10));}程序的运行结果是()[2008年9月 选择题 第31题]A)0B)10C)20D)出错解析:答案为C。函数调用时,传值10给形参n,而在fun()函数中,指针变量p接收形参的值,并返回所接收的值。所以第一次调用fun函数后,变量a的值为10,加上第二次调用得到的值10,最后的输出结果为20。2.以下定义语句中正确的是()[2008年4月 选择题 第15题]A)inta=b=0;B)charA=65+1,b=’b’;C)floata=1,*b=&a,*c=&b;D)doublea=0.0;
7、b=1.1;解析:答案为B,选项C错在给指针变量c赋值应该直接赋变量地址或指针变量。3.若在定义语句:inta,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是()[2007年9月 选择题 第15题]A)scanf(“%d”,a,b,c);B)scanf(“%d%d%d”,a,b,c);C)scanf(“%d”,p);D)scanf(“%d”,&p);解析:答案为C,p为指针变量,其中存放是变量c的地址。4.设已有定义:floatx;则以下对指针变量p进行定义且赋初值的语句中正确的是( )[2
8、007年4月 选择题 第29题]A)float*p=1024; B)int*p=(floatx);C)floatp=&x; D)float*p=&x;解析:答案为D。给指针变量赋值不能赋非地址类型的数据,则选项A错误,选项B格式错误,选项C中p是普通变量,不是指针变量。5.有以下程序:#includemain(){intn,*p