收藏 分享(赏)

第八章 指针.ppt

上传人:无敌 文档编号:813412 上传时间:2018-04-26 格式:PPT 页数:24 大小:1.08MB
下载 相关 举报
第八章 指针.ppt_第1页
第1页 / 共24页
第八章 指针.ppt_第2页
第2页 / 共24页
第八章 指针.ppt_第3页
第3页 / 共24页
第八章 指针.ppt_第4页
第4页 / 共24页
第八章 指针.ppt_第5页
第5页 / 共24页
点击查看更多>>
资源描述

1、第八章 指针,考试要点,一、考核知识点(15%左右):1.指针与指针变量的概念,指针与地址运算符2.变量、数组、字符串、函数的指针及指向变量、数组、字符串、函数的指针变量。通过指针引用以上各类型数据。3.用指针作为函数参数。4.指针数组、指向指针的指针。二、重要考点:1.对指针概念的理解。2.指针作为函数的参数。3.字符类型指针的操作。,8.1 变量的地址和指向变量的指针变量,考点1 指针变量的定义 定义指针变量的一般形式如下: 类型名 *指针变量名1,*指针变量名2,; 如: int *p,*t; 注意 (1)定义时变量前的*是一个类型说明符,用来标志该变量是指 针变量,与操作时的*p中的指

2、针运算符*相区别. (2)定义指针时前面的类型名又称作指针变量的基类型,基类型 用来指定该指针变量可以指向的变量的类型。基类型决定了 在对指针移动,即对地址进行增减运算时1个逻辑单位代 表的字节数。 考点2 指针变量的引用 指针变量中只能存放地址(指针),将一个整型变量(或任何其他非地址类型的数据)赋给一个指针变量是不允许的。如: int *p; p=300;是不合法的,8.1 变量的地址和指向变量的指针变量,考点3 指针变量作为函数参数 前面的章节中介绍过,函数参数可以是整型、实型、字符型等数据,指针类型数据同样也可以作为函数的参数来进行传递。它的作用是将一个变量的地址传送到另一个函数中,参

3、与该函数的运算。 如果想通过函数调用从而得到n个要改变的值,可以采用如下方法: (1)在主调函数中设n个变量,分别用n个指针变量指向它们。 (2)然后将各个指针变量作为实参,即将这n个变量的地址传给所调用的函数的形参。 (3)通过形参指针变量的改变,从而改变这n个变量的值。 (4)主调函数中就可以使用这些改变了值的变量。,8.2 数组与指针,一个数组包含若干个元素(变量),在定义时被分配了一段连续的内存单元。因此,可以用一个指针变量来指向数组的首地址,通过该首地址就可以依次找到其他元素,同样指针变量也可以指向数组中的某一个元素。考点4 指向数组元素的指针 C语言规定数组名代表数组的首地址,也就

4、是数组中下标为0的元素的地址。有如下语句: int c10=0; int *p; p=c; 则语句p=c; 与语句p= 指针变量p指向了数组c中下标为5的那个元素,即p用来保存c5的地址。,8.2 数组与指针,考点5 通过指针引用数组元素 按C语言的规定:如果指针变量p已经指向数组中的一个元素,则p+1指向同一数组中的下一个元素(而不是将p的值简单加1),这里的加1是指增加一个单位长度(与数组基类型所占存储单元相同)。例如,数组元素是浮点型,每个元素占4个字节,则p+1意味着使p的值(是一个地址)加4个字节,以使它指向下一个元素。考点6 用数组名作为函数参数 数组名可以用作函数的形参和实参。当

5、数组名作为形参被传递时,若形参数组中各元素发生了变化,则原实参数组与形参数组共占一段内存单元。而如果用数组元素作为实参的情况就与用变量作为实参时一样,是值传递,即单向传递,即使形参数组元素值发生了变化,原实参的数组元素值也不会受影响。,8.2 数组与指针,考点7 指向多维数组的指针和指针变量 有如下定义: int c34,*p; c是该二维数组的数组名,它代表了整个数组的首地址,也就是第0行的首地址,c+1代表第1行的首地址,即c+1是c1的地址,c0,c1,c2既然是一维数组名,而C语言又规定了数组名代表数组的首地址,因此c0代表第0行的一维数组中第0列元素的地址,即&c00,同样的c1的值

6、是&c10。 第0行第1列元素的地址又怎样表示呢?可以用c0+1来表示,即&c00+1,注意此时的1代表1个列元素的字节数。即2个字节。 根据上面的介绍,ci和*(c+i)等价,因此c0+1和*(c+0)+1的值都是&c01,都是用来表示第0行第1列的元素的地址,ci从形式上看是数组c中第i个元素。如果c是二维数组名,则ci是代表一维数组名,ci本身并不占实际的内存单元,它也不存放数组中各个元素的值,它只是一个地址,c、c+i、ci、*(c+i)+j、ci+j都是地址,*(ci+j)、*(*(c+i)+j)是元素的值,具体见下表。,8.2 数组与指针,考点7 指向多维数组的指针和指针变量 有如

7、下定义: int c34,*p;,8.3 字符串与指针,考点8 字符串的表示形式 (1)用字符数组存放一个字符串,然后输出该字符串。 例如:char str=“I am a student.”; printf(“%sn”,str); (2)用字符指针指向一个字符串。 可以不定义数组,而定义一个字符指针,用字符指针指向字符串中的字符。 例如:char *str=“I am a student.”; /*定义str为指针变量,并指向字符串的首地址*/ printf(“%sn”,str); C语言中对字符串常量的处理是按字符数组进行处理的,在内存中开辟了一个字符数组来存放字符串常量。在输出时,利用字

8、符型指针str的移动来控制输出,直到遇到字符串结束标志0为止。考点9 字符串指针作函数参数 将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法,即用字符数组名作为参数或用指向字符串的指针变量作为参数,进行传递。,8.3 字符串与指针,考点10 字符指针变量和字符数组的区别 虽然字符数组和字符指针变量都能实现对字符的存储和运算,但她们两者之间有如下区别: (1)就内容而言,字符数组是由若干元素组成的,每个元素中存放一个 字符,而字符指针变量中存放的是地址(字符串的首地址),绝不是 将字符串的内容存放到字符串指针变量中。 (2)就赋值方式而言,对字符数组只能对各个元素赋值,不能用以下方

9、法对字符数组赋值: char str20; str=“I am happy.”; (X) 而对字符指针变量,可以采用以下方法赋值: char *s; s=“I am happy” () (3)字符数组可以在定义时对其整体赋初值(即初始化),但在赋值语句 中不能完成整体赋值。如下面的做法是不允许的: char s30; s=“I am so happy.”; 而字符串指针变量既可以在定义时对其整体赋初值,也可以出现在赋 值语句中,相对来说要比在字符数组使用起来灵活一点。,8.3 字符串与指针,考点10 字符指针变量和字符数组的区别 (4)如果定义了一个字符数组,在编译时,系统会为它分配一段连续呃

10、 内存单元,它的地址是确定的,而当定义了一个字符串指针变量 后,就要即时给该指针变量分配内存单元,该指针变量中可以存放 一个地制值,也就是说,该指针变量可以指向一个类型的数据,但 如果未对它赋以一个地址值,则它并未具体指向一个确定的数据, 如: char s10; scanf(“%s”,s); 是可以的 但下面的方法是及其危险的: char *s; scanf(“%s”,s); 应该这样: char *a, s10; a=s; scanf(“%s”,a); (5)在程序中指针变量的值可以改变,当要输出字符串时,从s当前所指 向的单元开始输出各个字符,直到遇到0为止。而数组名虽然代 表了地址,但

11、它的值是一个固定的值(地址常量),是不能改变的。 下面是错的: char str=“chaina”; str=str+2;,8.4 指向函数的指针,考点11 用函数指针变量调用函数 我们已经知道,可以用指针变量指向函数变量、字符型变量、字符串、数组,同样指针变量可以指向一个函数,即将一个函数的首地址放入指针变量,称为函数指针,可以通过使用这个指向函数的指针变量来调用此函数。 说明: (1) 指向函数的指针变量的一般定义形式为 数据类型(*指针变量名) ( ); 如: int (*s)(); 数据;类型指该函数返回值的类型。 (2)(*s)表示了定义了一个指向函数的指针变量,但目前它不是固定指向

12、哪一个函数,而只是定义了这样一个类型的变量,它的作用是专门用来存放函数的入口地址的,在程序中实现把某一个函数的地址赋给它,它就指向那一个函数,这样它的值就确定了。,8.4 指向函数的指针,考点11 用函数指针变量调用函数 (3)在给函数指针变量赋值时,只需要给出函数名而不必给出 参数。 如: s=fun; /*fun为已有定影的有参函数*/ 因为是将函数入口地址赋给s,不涉及到参数的问题,不能写为: s=fun(a,b); (4) 用函数指针变量调用函数时,只需将(*s)代替函数名即(s为已定义过的指向函数的 指针变量名),在(*s)之后的括号中根据需要写上实参。 (5)对指向函数的指针变量,

13、有些运算,如+s,-s,s+3等都是没有意义的。,8.5 返回指针值的函数,考点12 返回指针值的函数 一个函数的返回值可以是一个整型值、字符型值、实型值等,同样的,函数的返回值也可以是指针类型的数据,即地址。这种返回指针值的函数,一般定义形式为: 类型名 *函数名(参数表); 例如: int *fun(int a,int b);,8.6 指针数组和指向指针的指针,考点13 返回指针值的函数 若在一个数组里,其元素均为指针类型数据,这样的数组称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为: 类型名 *数组名数组长度; 例如: int *a10; (

14、比*的优先级要高) 指针数组的一个重要的用途就是它可以用来指向若干个字符串。移动字符串时只需移动指向它们的指针即可,这样各字符串的长度可以不同,而且移动指针变量的值(地址)要比移动字符串所花时间少。 考点14 指向指针的指针 指向指针数据的指针变量,简称为指向指针的指针,通常称为二级指针。定义一个指向指针数据的指针变量的形式: 类型名 *a; a前面有两个”*”号,*a是指针变量的定义形式,现在它前面又有一个”*”号,表示指针变量是指向某种类型的指针变量的。,8.7 典型例题,一、选择题1.各选项中,对基类型相同的指针变量不能进行运算的运算符是()+ B) - C) - D) +2.若有定义:

15、int a34; ( )不能表示数族元素a11。 A) *(a1+1) B) *( 则正确的赋值表达式是( ) A) pb=&x B)pb=x C)*pb=&x D)*pb=*x,8.7 典型例题,一、选择题5.以下程序的输出结果是( )#include main()int k=2,m=4,n=6; int *pk=,8.7 典型例题,一、选择题7.下面程序的运行结果是( )#include #include fun(char *w,int n)char t,*s1,*s2; s1=w; s2=w+n-1; while(s1s2) t=*s1+; *s1=*s2-; *s2=t;main()c

16、har *p; P=“1234567”; fun(p,strlen(p); puts(p);7654321 B)1714717 C)1711717 D)7177171,8.7 典型例题,一、选择题8.下面函数的功能是( )sss(s,t) char *s,*t; while(*s) A)求字符串的长度 B)比较两个字符串的大小 C)将字符串s复制到字符串t中 D)将字符串s连接到字符串t中,8.7 典型例题,一、选择题9.请选出以下程序的输出结果()#include main()int a=1,2,3,4,i; int x=0; for(i=0;i4;i+) sub(a,x); printf(

17、“%d”,x); printf(“n”);void sub(int *s,int y)static int t=3; y=st; t-;A)1 2 3 4 B)4 3 2 1 C) 0 0 0 0 D)4 4 4 4,8.7 典型例题,二、填空题1.以下程序的输出结果为_ main() int arr=30,25,20,15,10,5,*p=arr; p+; printf(“%dn”,*(p+3); 2.以下程序通过函数指针p调用函数fun(),请在空格处写出定义变量p的语句。 void fun(int *x,int *y) main() int a=10,b=20; _; /*定义变量p*/

18、 p=fun; p( ,8.7 典型例题,二、填空题3.以下程序的输出结果是_ #include main() char *p=“abcdefgh”,*r; float *q; q=(float *)p; q+; r=(char *)q; printf(“%sn”,r); ,8.7 典型例题,二、填空题4.以下程序的输出结果是_ #include main() int x=0; sub( ,8.7 典型例题,二、填空题5.下面程序的运行结果是_#include #include main() char *p1,*p2,str50=“abc”; p1=“abc”; p2=“abc”; strcpy(str+1,strcat(p1,p2); printf(“%sn”,str); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报