指针是C语言中的一个概念

上传人:宝路 文档编号:48160261 上传时间:2018-07-11 格式:PPT 页数:54 大小:124.12KB
返回 下载 相关 举报
指针是C语言中的一个概念_第1页
第1页 / 共54页
指针是C语言中的一个概念_第2页
第2页 / 共54页
指针是C语言中的一个概念_第3页
第3页 / 共54页
指针是C语言中的一个概念_第4页
第4页 / 共54页
指针是C语言中的一个概念_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《指针是C语言中的一个概念》由会员分享,可在线阅读,更多相关《指针是C语言中的一个概念(54页珍藏版)》请在金锄头文库上搜索。

1、 指针是C语言中的一个概念,正确而灵活地运用指针,可以有效地表示复杂的数据结构、难动态分配内存、方便使用字符串和数组、能使函数返回一个以上的结果、能直接使用内存地址等。本章内容包括:10.1 地址和指针的概念10.2 变量的指针和指向变量的指针变量 10.3 数组与指针10.4 字符串与指针10.5 指向函数的指针10.6 返回指针值的函数10.7 指针数组与指向指针的指针10.1地址和指针的概念一、指针概述:1、地址的概念与取地址运算:内存以字节编码,每个编码都是一个地址。我们原先学过的变量、数组、函数等都放在内存中,在程序中,我们是通过变量名等使用变量、给变量赋值等,但实际运行时,系统使用

2、的是内存地址,而不是变量名。我们怎样知道机器将某种数据放在内存的什么地方呢?可用求地址运算符 看出其地址。注意,这个地址并不是始终不变的,这是由机器和操作系统来安排的,我们无法预先知道。 在数组中,数组名代表数组的首地址故a表示的地址和scanf(“%d“,printf(“i=%dn“, i); C编译程序编译到该变量定义语句时,将变量i 登录到“符号表 “中。符号表的关键属性有两个:一是“标识符名(id)“ ,二 是该标识符在内存空间中的“地址(addr)“ 。 为描述方便,假设系统分配给变量i的2字节存储单元为 2000 和2001,则起始地址2000就是变量i在内存中的地址。3.变量值的

3、存取通过变量在内存中的地址进行 系统执行“scanf(“%d“,“和“printf(“i=%dn“, i);“时, 存取变量i值的方式可以有两种:(1)直接访问直接利用变量的地址进行存取1)上例中scanf(“%d“,“得到 。此时,指针变量i_pointer的值就是变量i在内存中的起始地 址2000,如图10-1所示。 通过指针变量i_pointer存取变量i值的过程如下: 首先找到指针变量i_pointer的地址(3010),取出其值2000 (正好是变量i 的起始地址); 然后从2000、2001中取出变量 i的值(3)。 (3)两种访问方式的比较 两种访问方式之间的关系,可以用某人甲(

4、系统)要找某人乙 (变量)来类比。 一种情况是,甲知道乙在何处,直接去找就是(即直接访问) 。 另一种情况是,甲不知道乙在哪,但丙(指针变量)知道,此 时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙 (即间接访问)。10.2 变量的指针和指向变量的指针变量(1)指针即地址一个变量的地址称为该变量的指针。通过变量的指针能够找到 该变量。 (2)指针变量专门用于存储其它变量地址的变量 指针变量i_pointer的值就是变量i的地址。指针与指针变量的 区别,就是变量值与变量的区别。 (3)为表示指针变量和它指向的变量之间的关系,用指针运算 符“*“表示。 例如,指针变量i_pointer与它

5、所指向的变量i的关系,表示为 : *i_pointer,即*i_pointer等价于变量i。 因此,下面两个语句的作用相同: i=3; /*将3直接赋给变量i*/ i_pointer= /*使i_pointer指向i */ *i_pointer=3; /*将3赋给指针变量i_pointer所指向 的变量*/10.2.1定义一个指针变量 指针变量的定义一般形式为:基类型 *指针变量名;例如:int i, j, *pi, *pj;float x, y, *p1, *p2;指针变量的赋值:使得指针变量指向变量指针变量名如: pi= pj= p1= p2= 注意:指针变量只能存放指针(地址),且只能是

6、相同类型变量 的地址。 例如,指针变量pi、pj,只能接收int型、p1, p2只能接收float 型的地址,否则出错。10.2.2 指针变量的引用在程序中,可以用:*指针变量名 代替其所指变量。如若int i, *p;p=则 i=5; 与*p=5; 的作用相同,即可用*p代替i,这里*号称为指 针运算符(或称为间接访问运算符)例10.1 通过指针变量访问整型变量main()int a, b, point_1, point_2;a=100; b=10;point_1= point_2=printf(“n%d,%dn“,a,b);printf(“%d,%d“,*point_1,*point_2)

7、;例10.2 输入a和b两个整数,按先大后小的顺序输出a和b的值main()int a, b, *p, *p1, *p2;p1=p2*=scanf(“%d%d“,p1,p2);if(avoid main()int a10,i,*p;for(i=0;i void main() int *p,i,a10; p=a; for(i=0;i void main() int i, a10=0,1,2,3,4,5,6,7,8,9,*p; void inv(int x,int n); for(i=0;ivoid main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int

8、*p;for(p=a0;pvoid main()int a34=1,3,5,7,9,11,13,15,17,19,21,23;int (*p)4,i,j;/定义一个指向含有4个元素的整型数组p=a;scanf(“i=%d,j=%d“,printf(“a%d,%d=%dn“,i,j,*(*(p+i)+j);3.指向数组的指针作为函数参数例10.13 有一个班,3个学生,各学4门课程,计算总1平均分 数及输出第n个学生的成绩。算法设计: 主函数:1,函数声明 2,初始化成绩 3,调用求平均成绩的函数 4,调用函数输出第i个学生的成绩求平均值函数: 1,求总成绩 2,返回平均成绩输出函数 使用for

9、循环,直接输出成绩#include void main( )void average(float *p,int n);void search(float (*p)4, int n);float score34=65,67,70,60,80,87,90,81,90,99,100,98;average(*score,12);search(score,2); void average(float *p,int n)float *p_end;float sum=0,aver;p_end=p+n-1;for(;pvoid main()char string=“I love China“);printf(

10、“%s“,string);2, 用字符指针指向一个字符串。例10.16#includevoid main()char *string=“I love China“;printf(“%s“,string);10.4.2 字符串指针作为函数参数例10.20 用函数调用实现字符串的复制 #include void copy_string (char *from, char *to)for(; (*to=*from)!=0; from+, to+) ; void main()void copy_string (char *from, char *to);char array_str120=“I am

11、a teacher.“;char array_str220;copy_string(array_str1, array_str2); /*数组名作实参*/printf(“array_str2=%sn“, array_str2);程序说明: for(; (*to=*from)!=0; from+, to+) ; 语句的执行过程为:首先将源串中的当前字符,复制到目标串中;然后判断该字符(即赋值表达式的值)是否是结束标志。如果不是,则相对位置变量i的值增1,以便复制下一个字符;如果是结束标志,则结束循环。其特点是:先复制、后判断,循环结束前,结束标志已经复制。在C语言中,用赋值运算符、而不是赋值语句

12、来实现赋值操作,能给某些处理带来很大的灵活性,该语句(实现字符串的复制)的用法就是最好的例证。10.5 指向函数的指针1.函数指针的概念一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。2.指向函数的指针变量(1)定义格式函数类型 (*指针变量)( );注意:“*指针变量”外的括号不能缺,否则成了返回指针值的函数。例如,int (*fp)(); /* fp为指向int函数的指针变量*/(2)赋值函数名代表该函数的入口地址。因此,可用函数名给指向函数的指针变量赋值。指向函数的指针变量 注意:函数名后不能带括号和参数;

13、函数名前的“ int min(int,int); int add(int,int); int process(int, int, int (*fun)(); int a,b; printf(“enter a and b:“); scanf(“%d%d“, printf(“nmax=“); process(a,b,max); printf(“nmin=“); process(a,b,min); printf(“nsum=“); process(a,b,add); max(int x, int y)return xy?x:y;min(int x, int y)return xy?y:x;add(i

14、nt x, int y)return x+y;process(int x, int y, int (*fun)(int,int) /*fun是一个指向函数 的指针,该函数是一个有两个整型参数的返回整型值的函数*/int result;result=(*fun)(x,y);printf(“%dn“,result);作业10.4,10.5要求相应的写出算法和程序10.6 返回指针值的函数一个函数可以返回一个int型、float型、 char型的数据,也可以返回一个指针类型的数 据。 返回指针值的函数(简称指针函数)的定 义格式如下:函数类型 *函数名(形参表列)例如:int *a(int x,in

15、t y);该函数的函数名为a,返回的是一个整型的指针 。例10.24 有若干个学生的成绩(每个学生有4门课程)要求在 输入学生序号后,能输出该学生的全部成绩 #include void main() float score4=60,70,80,90,56,89,67,88,34,78,90,66 ; float *search(float (*point)4,int n); float *p; int i,m; printf(“请输入学生的序号:“); scanf(“%d“, printf(“序号为%d的学生的成绩:n“,m); p=search(score,m); for(i=0;i void main() float score4=60,70,80,90,56,89,67,88,34,78,90,66; float *search(float (*point)4); float *p; int i,j; for(i=0;i #include void main() void sort(char *name ,int n);void print(char *name,int n);int n=5;char *n

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号