版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章 主要内容10.1地址和指针的概念10.变量的指针和指向变量的 指针变量10.数组与指针10.字符串与指针10.指向函数的指针10.返回指针值的函数10.指针数组和指向指针的指针10.8有关指针的数据类型和指针运算的小结C程序设计(第三版)210.1地址和指针的概念.按变量地址存取变量值的方式称为“直接访问”方式(,); (,);C程序设计(第三版)3内存区的每一个字节有一个编号,这就是“地址” 。如果在程序中定义了一个变量,在对程序进行编译时, 系统就会给这个变量分配内存单元。C程序设计
2、(第三版)42. 另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。在语言中,指针是一种特殊的变量,它是存放地址的。C程序设计(第三版)5指针和指针变量的定义:一个变量的地址称为该变量的“指针”。例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。C程序设计(第三版)610.2变量的指针和指向变量的指针变量10.1定义一
3、个指针变量定义指针变量的一般形式为基类型 *指针变量名;C程序设计(第三版)7个该变量。下面都是合法的定义:float*pointer_;char *pointer_;可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一例 如 : pointer_; pointer_;C程序设计(第三版)8在定义指针变量时要注意两点:(1) 指针变量前面的“*”,表示该变量的类型为指针型变量。例: float*pointer_1;指针变量名是pointer_1 ,而不是* pointer_1 。(2
4、) 在定义指针变量时必须指定基类型。需要特别注意的是,只有整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的floata;int* pointer_1;pointer_1=&a;C程序设计(第三版)910.2.2指针变量的引用注意:指针变量中只能存放地址(指针),不要将一个整数(或任何其他非地址类型的数据) 赋给一个指针变量。 例10. 通过指针变量访问整型变量C程序设计(第三版)10#include voidmain ( ) int ,;int*pointer_, *point
5、er_; ; pointer_; /*把变量的地址赋给pointer_1 */C程序设计(第三版)11pointer_; /*把变量的地址赋给pointer_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_);对“”和“*”运算符说明:如果已执行了语句 pointer_;(1)* pointer_的含义是什么? “”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,* pointer_与相同,即变量a的地址。如果有pointer_2 * pointer_ ;它的作用是将(的地址)赋给
6、pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。C程序设计(第三版)12C程序设计(第三版)13(2) *的含义是什么?先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。(3) (*pointer_)相当于。C程序设计(第三版)14例10 . 2输入和两个整数,按先大后小的顺序输出和。C程序设计(第三版)
7、.cn15#include voidmain() int *1,*2,*,;scanf(,); 1; if(); printf(=,=,); printf(max=,min=,*1,*2);C程序设计(第三版)16运 行 情 况 如 下 : , , ,当输入,时,由于, 将和交换。交换前的情况见图(),交换后见图()。C程序设计(第三版)1710.3指针变量作为函数参数 例10 . 3对输入的两个整数按大小顺序输出C程序设计(第三版)18#inc
8、lude void main()void swap(int *,int *);int ,;int *pointer_,*pointer_; scanf(,); pointer_ ; pointer_2 ;if(swap( pointer_ , pointer_2 );printf(,);C程序设计(第三版)19void swap(int *,int *) inttemp; temp*1;*;*temp;C程序设计(第三版)20 例10. 输入、 3个整数,按大小顺序输出。C程序设计(第三版)ht
9、tp:/21#include void main() voidexchange(int *1, int *2, int *3);int,*,*,*; scanf(%,%,%,&, &, &); ; exchange (,); printf(,);voidexchange(int *, int *, int *) voidswap(int *, int *); if(*) swap(,);if(*) swap(,); if(* swap(,);voidswap(int *, int *)int temp; temp*;*;*temp;C程序设计(第三版)ht
10、tp:/2210.3数组与指针一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。C程序设计(第三版)2310.3.1指向数组元素的指针定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。例如:;(定义为包含个整型数据的数组)*;(定义为指向整型变量的指针变量)应当注意,如果数组为型,则指针变量的基类型亦应为型。C程序设
11、计(第三版)24对该指针变量赋值:;把元素的地址赋给指针变量。也就是使 指向数组的第号元素,如图:C程序设计(第三版)2510.通过指针引用数组元素引用一个数组元素,可以用:() 下标法,如形式;() 指针法,如*()或*()。其中是数组名,是指向数组元素的指针变量,其初值。 例10.5输出数组中的全部元素。假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:C程序设计(第三版)26C程序设计(第三版)http:/ccf.tsinghua
12、.27(1)下标法。#include voidmain() int ;int ;for(;) scanf(,); printf();for(;) printf(,);(2) 通过数组名计算数组元素地址,找出元素的值。#include voidmain() int ;int ;for(; ) scanf(,); printf();for(;) printf(,*();C程序设计(第三版)28C程序设计(第三版)29(3) 用指针变量指向数组元素。#include voidmain()
13、int ;int*,; for(;)scanf(,); printf(); for(;();)printf( ,*);#include voidmain() int*,; ; for(; ) 例10. 通过指针变量输出数组的个元素。程序运行情况:1 2 3 4 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259 8237 28483显然输出的数值并不是数组中各元素的值scanf(,);printf(); for(;, ) printf(,*);C程序设计(第三版)30C程序设计(第三版)http:/c
14、31#include voidmain() int*,; for(;) scanf(,); printg();p=a;for(;, )printf(,*);10.3用数组名作函数参数在第8章8.7节中介绍过可以用数组名作函数的参数 如: void main()i(int arr,int ); int array; (array,);void (int arr,int )C程序设计(第三版)32 例10 将数组中个整数按相反顺序存放。C程序设计(第三版)33#i
15、nclude voidmain() voidinv(int ,int );int ,; printf(The original array:); for(;)printf (,);printf();inv (,);printf(The array has been in verted:); for(;)printf (,);printf ();C程序设计(第三版)34;temp;return;voidinv(int ,int )/*形参x是数组名*/inttemp,();for(;);temp;运行情况如下:The original array
16、:,The array has beeninverted:,C程序设计(第三版)35C程序设计(第三版)36C程序设计(第三版)对刚才的程序可以作一些改动。将函数inv中的形参改成指针变量。#include voidmain()voidinv(int *,int );int ,;printf( The original array: );for(;) printf (,); printf ();inv(,);printf ( The array has been in verted: );for
17、(;) printf (,);printf ();37C程序设计(第三版)38voidinv(int *,int )/*形参x为指针变量*/int,temp,*,*,(); ; for(;,)emp*;*;*temp;return;如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:(1) 形参和实参都用数组名,如:voidmain()void(int ,int ) int ;(,);C程序设计(第三版)39C
18、程序设计(第三版)40(2) 实参用数组名,形参用指针变量。如:void ()void (int *,int )int;(,);(3)实参形参都用指针变量。例如:voidmain()void (int *,int )int , *p=a; (p,);C程序设计(第三版)41C程序设计(第三版)42(4) 实参为指针变量,形参为数组名。如:void main()void (int x ,int ) ,*p=a; (p,);C程序设计(第三版)htt
19、p:/43C程序设计(第三版)44#include voidmain()voidinv(int *,int );int ,*; printf(The original array:n ); for(;,) scanf(,);printf();inv(,);/* 实参为指针变量 */printf(The array has been inverted :); for(; ) printf(,*);printf();C程序设计(第三版)45voidinv(int
20、 *,int )int,temp,*,*; ();for(;,)emp*;*;*temp;return; 例109 用选择法对个整数按由大到小顺序排序。C程序设计(第三版)46#include voidmain() voidsort(int ,int );int*,10; ; for(;)scanf(,);sort(,); for(,;)(,*);C程序设计(第三版)47voidsort(int ,int ) int ,;for(;); for(;) ();(!); ; ;10.3.4数组与指针
21、用指针变量可以指向一维数组中的元素,也可以指向数组中的元素。但在概念上和使用上,的指针比一维数组的指针要复杂一些。数组1. 数组元素的地址先回顾一下数组的性质,可以认为二维数组是“数组的数组”,例 :定义int a34=1,3,5,7, ,; 则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为,则C程序设计(第三版)48表示形式含义地址a二维数组名,指向一维数组a0,即0行首地址2000a0,*(a+0),*a0行0列元素地址2000a+1,&a11行首地址2008a1,*(a+1)1行0列元素a10的地址2008A1+2,*(a
22、+1)+2,&a121行2列元素a12的地址2012*(a1+2),*(*(a+1)+2),a121行2列元素a12的值元素值为13C程序设计(第三版)49 例10.0 输出二维数组有关的值C程序设计(第三版)50#include defineFROMAT, void main() int 341,3,5,7,9,; printf(,*); printf(,0 , *(); printf(,0,00); printf(,1,); printf(,10,*(+)+); printf(,*(); p
23、rintf(,); printf(,*(*();某一次运行结果如下:(0行首地址和0行0列元素地址)(0行0列元素地址)(0行0首地址和0行0列元素地址) (1行0列元素地址和1行首地址) (1行0列元素地址)(2行0列元素地址) (2行首地址)(1行0列元素的值), , , , , ,C程序设计(第三版)517,19,21,23;2 . 指向数组元素的指针变量(1) 指向数组元素的指针变量例10.11用指针变量输出二维数组元素的值#include void main() int 341,3,5,7,9,11,13,15,1int*;for(;
24、)()printf(); printf(,*); C程序设计(第三版)52运行结果如下:13579111315192123( )1,3,5,7,9,11,3,15,;(2) 指向由个元素组成的一维数组的指针变量例10.13出二维数组任一行任一列元素的值#include main 运行情况如下:void, int 1int (*),;scanf( ,);printf(,*(*();C程序设计(第三版)533. 用指向数组的指针作函数参数例10.13 有一个班,个学生,各学门课,计算总平均分数以及第
25、个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第个学生的成绩。C程序设计(第三版)54C程序设计(第三版)55#include voidmain()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
26、,12);*求12个分数的平均分* search(score,);*求序号为的学生的成绩*C程序设计(第三版)56voidaverage(float *,int ) float*_; float sum,aver; p_end;for(;_;) sumsum(*); aversum;printf(average,aver);C程序设计(第三版)57程序运行结果如下: average ThescoreofNo.2are:.voidsearch(float (*)4,int )/ * p是指向具有4
27、个元素的一维数组的指针*/int ;printf(the score ofNo. % are:,); for(;) printf(5.2,*(*();C程序设计(第三版)58#include void main()voidsearch(float (*p)4,int n);/*函数声明*/floatscore34=65,57,70,60,58,87,90,81,90,99,100,98;search(score,);例10.4 在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。for(;printf(%.,*(*( pr
28、intf();C程序设计(第三版)59voidsearch(float (*p)4,int )int ,;for(;)flag;for(;) if(*(*())flag; if() printf(No.%d fails,his scores are:n,j+1);));程序运行结果如下:No.1fails,his scores are:. . . .No.2fails,his scores are: . . . .10.字符串与指针10.4.字符串的表示形式(1) 用字符数组存放一个字符串,然后输出该字符串。例 10.5定义一个字符数组,对它初
29、始化, 然后输出该字符串#include voidmain()char stringI love China!;printf(,string);C程序设计(第三版)60(2) 用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。C程序设计(第三版)61例106 定义字符指针#include voidmain()charstring I love China!;printf(,);例10.7 将字符串复制为字符串。#include void ()char
30、 amaboy,20;int ;for(;*()!;)*()*();*(); printf(stringais :,); printf(string b is:);for(;!;) printf(,); printf();C程序设计(第三版)62也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。 例10.8 用指针变量来处理例107问题。C程序设计(第三版)63#include voidmain()char =I am a boy. ,20,*p1,*p2;int ; ;for(;*!
31、;p1,p2)程序必须保证使和同步移动C程序设计(第三版)64*;*;printf(string is:,); printf( :); for(;!;) printf(,); printf();C程序设计(第三版)6510.4.2字符指针作函数参数(1)用字符数组作参数例10.19用函数调用实现字符串的复制#include voidmain() voidcopy_string(char from , char to );char a = am a teacher; char =you are a
32、 student;printf(“string a= string , ,);printf(“copy string a to string b:n ”); copy_string (,);printf(nstring a=%snstring b=%sn,a,b);C程序设计(第三版)66C程序设计(第三版)67程序运行结果如下:stringaI am a teacher stringb you are a student copy string a to string b:string a I
33、 am a teacher stringI am a teachervoidcopy_string(char from , char to ) int ;while(from!)tofrom;to;(2) 形参用字符指针变量C程序设计(第三版)68#include voidmain() void copy_string(char * from, char *);char * amateacher .;char *you are a student ;printf(string a=string , ,);printf(copy string a
34、 to string b:n );_(,);printf(nstring a=%snstring b=%sn,a,b);(3) 对copy string函数还可作简化C程序设计(第三版)691、将copy_string函数改写为voidcopy_string (char *from,char *)while(*from)!)to;from;voidcopy_string(char *,char *) for(;*from!;from,to)*tofrom;*to;C程序设计(第三版)70 cop
35、y_string函数的函数体还可写成while(*from!)*to*from;*to; copy_string函数的函数体还可改为while(*to*from)!);C程序设计(第三版)71 函数体中while语句也可以改用for语句: for(;(*to*from)!;); 或for(;*to*from;); 上面的while语句还可以进一步简化为下面的while语 句:while(*to*from); 它与下面语句等价:while(*to*from)!);将*from赋给*to,如果赋值后的*to值等于则循环终止(已赋给*to)C程序设计
36、(第三版)72 也可用指针变量,函数copy_string可写为voidcopy_string (char from ,char )char*,*; from; while(*p2*p1)!);10.4.3对使用字符指针变量和字符数组的讨论字符数组和字符指针变量二者之间的区别:(1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。(2) 赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值。charstr;strI love China!
37、;而对字符指针变量,可以采用下面方法赋值:char*;I love China!;C程序设计(第三版)73(3)对字符指针变量赋初值:char * love China!;等价于char*;I love Chian!;而对数组的初始化:charstr loveChina!;不能等价于char str;str I love China!;C程序设计(第三版)74(4) 定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时, 给指针变量分配内存单元,在其中可以放一个
38、字符变量的地址。例如:char str;scanf(,str);C程序设计(第三版)75(5) 指针变量的值是可以改变的,例如:C程序设计(第三版)76#include void ()char*I love China!;printf(,);例10.0改变指针变量的值若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。例如:C程序设计(第三版)77#include voidmain()char* love
39、 hina!;int ;printf ( “ The sixth character is %cn,a5); for(;!;) printf(,);10. 指向函数的指针10.5.1用函数指针变量调用函数 用指针变量可以指向一个函数。 函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针。C程序设计(第三版)78C程序设计(第三版)79#include voidmain() intmax(int,int);int ,; scanf(,); (,); printf(,);intma
40、x(int ,int ) int ;if(); else;return();C程序设计(第三版)80将 main 函数改写为#include voidmain()int(int,int);int (*)(); int ,; ;scanf(,);(*)(,);printf(, ,);10.5.2用指向函数的指针作函数参数函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。C程序设计(第三版)81f1实
41、参函数名void (int (*x1)(int),int (*x2)(int,int)) int ,; (*)(); *调用函数*(*)(,);*调用函数*C程序设计(第三版)82例10.3 设一个函数process,在调用它的时候,每次实现不同的功能。输入和两个数,第一次调用process时找出和中大者,第二次找出其中小者, 第三次求与之和。#include void main() int max(int,int);int min(int,int); int add(int,int);/* 函数声明*/* 函数声明*/* 函数声明*/void process (int , int , int(*fun)(); int ,;printf(enter a and b:);/* 函数声明*/scanf(,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年港口消防系统布局与消防能力建设规划
- 2026年电梯安装项目质量管理方案
- 2026年社区邻里中心的竞争环境与服务集成研究
- 2026年企业字号与商标冲突应对策略
- 怀念母亲教学设计6篇
- 肉芽肿性菌病治疗流程
- 难治性高血压的综合管理策略培训
- 支气管哮喘急性发作应急救治措施
- 2025年公务员(保障性住房后续管理)试题及答案
- 鼻窦炎保守治疗措施培训
- 2026年河南工业和信息化职业学院单招职业技能测试题库带答案解析
- 爆破救援应急预案
- 医院高警示药品管理制度及目录(2023年修订版)
- 2023年宣城辅警协警招聘考试真题及答案详解(历年真题)
- 邻近建筑及地下管线保护施工方案
- 2025年广西烟草招聘考试真题及答案
- 2025年中国林业科学院招聘面试指南模拟题与答题技巧
- 水工建筑物裂缝修补技术规范
- 水电站大坝模板施工方案
- (武大)公共管理学-5-第二章公共管理理论与实践的发展1课件
- 20kV及以下配电网工程设备材料价格信息(2025年上半年)
评论
0/150
提交评论