C程序设计 第6章_第1页
C程序设计 第6章_第2页
C程序设计 第6章_第3页
C程序设计 第6章_第4页
C程序设计 第6章_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第6章章 指针指针 1实用精品课件PPT 第第1章章 C语言概述语言概述 第第2章章 基本数据类型和运算基本数据类型和运算 第第3章章 结构化程序设计结构化程序设计 第第5章章 函数函数 第第6章章 指针指针 第第7章章 复合结构类型复合结构类型 第第8章章 编译预处理编译预处理 第第4章章 数组及字符串数组及字符串 课程概述课程概述 附录附录 6.1 指针的基本概念指针的基本概念 6.2 指针变量的运算指针变量的运算 6.3 指向数组元素的指针指向数组元素的指针 6.4 指向多维数组的指针变量指向多维数组的指针变量 6.5 指向字符串的指针变量指向字符串的指针变量 6.6指针型函数指针型函

2、数 6.7指针数组指针数组 6.8二级指针二级指针 6.9程序举例程序举例 6.10用指针进行内存动态分配用指针进行内存动态分配 6.11指针数据类型的总结指针数据类型的总结 第第9章章 位运算位运算 第第10章章 文件文件 2实用精品课件PPT 指针指针 第第6章章 教学目标教学目标 掌握指针的概念和运算规则掌握指针的概念和运算规则 掌握用指针访问变量、一维数组和二维数组掌握用指针访问变量、一维数组和二维数组 用指针处理字符串的方法用指针处理字符串的方法 3实用精品课件PPT 6.1.1 指针和指针变量指针和指针变量 6.1 指针的基本概念指针的基本概念 1. 指针的概念指针的概念 2. 指

3、针变量指针变量 内存单元的编内存单元的编 号叫做地址,号叫做地址, 通常也把这个通常也把这个 地址称为地址称为“指指 针针”。 4实用精品课件PPT 6.1.1 指针和指针变量指针和指针变量 6.1 指针的基本概念指针的基本概念 1. 指针的概念指针的概念 2. 指针变量指针变量 在语言中,在语言中, 允许用一个变允许用一个变 量来存放指针,量来存放指针, 这种变量称为这种变量称为 “指针变量指针变量”。 5实用精品课件PPT 6.1.2 指针变量的定义指针变量的定义 1. 定义的一般格式定义的一般格式 2. 举例说明举例说明 6.1 指针的基本概念指针的基本概念 存储类型存储类型 类型说明符

4、类型说明符 *变量名变量名; 其中,其中,“*”表示这是一个指针表示这是一个指针 变量,变量名即为定义的指针变量变量,变量名即为定义的指针变量 名,类型说明符表示本指针变量所名,类型说明符表示本指针变量所 指向的变量的数据类型。指向的变量的数据类型。 一个指针变量只能指向同一种类一个指针变量只能指向同一种类 型的变量,也就是说,不能定义一型的变量,也就是说,不能定义一 个既指向一个整型变量又指向一个个既指向一个整型变量又指向一个 双精度型变量的指针变量。双精度型变量的指针变量。 6实用精品课件PPT 6.1.2 指针变量的定义指针变量的定义 1. 定义的一般格式定义的一般格式 2. 举例说明举

5、例说明 6.1 指针的基本概念指针的基本概念 例如:例如:int *m1; 表示表示m1是一个指针变量,它的值是一个指针变量,它的值 是某个整型变量的地址;或者说是某个整型变量的地址;或者说m1 指向一个整型变量。至于指向一个整型变量。至于m1究竟指究竟指 向哪一个整型变量,应该由指向向哪一个整型变量,应该由指向m1 赋予的地址来决定。赋予的地址来决定。 再例如:再例如: static int *m2; /* m2是指向静态是指向静态 整型变量的指针变量整型变量的指针变量*/ float *m3; /* m3是指向浮点型变是指向浮点型变 量的指针变量量的指针变量*/ char *m4; /*

6、m4是指向字符型变是指向字符型变 量的指针变量量的指针变量*/ 7实用精品课件PPT 6.1.3 指针变量赋值指针变量赋值 1. 变量地址表示方法变量地址表示方法 2. 给指针变量赋给指针变量赋 地址的方法地址的方法 语言提供了地址运算符语言提供了地址运算符 “ 如:如: /*定义整型变量定义整型变量a*/ int *p= /*定义指针定义指针p, 并将变量并将变量a的地址赋给指针的地址赋给指针 p*/ (2)赋值语句的方法。)赋值语句的方法。 int a; /*定义整型变量定义整型变量a*/ int *p; /*定义指针定义指针p*/ p= /*将变量将变量a的地址的地址 赋给指针赋给指针p

7、*/ 6.1 指针的基本概念指针的基本概念 2. 给指针变量赋给指针变量赋 地址的方法地址的方法 3. 例例6.1 9实用精品课件PPT 6.1.3 指针变量赋值指针变量赋值 1. 变量地址表示方法变量地址表示方法 【例例6.1】用指针变量访问变量中的数用指针变量访问变量中的数 据。据。 #include main() int a,*p; /*定义整型变量定义整型变量a和整和整 型变量指针型变量指针p*/ p= /*指针指针p指向变量指向变量a*/ printf(please enter a number:n,*p); scanf(%d,p); /*为指针为指针p所指所指 的存储单元输入数值的

8、存储单元输入数值*/ printf(%dn,*p); /*输出指针输出指针 p所指的存储单元的内容所指的存储单元的内容*/ 6.1 指针的基本概念指针的基本概念 2. 给指针变量赋给指针变量赋 地址的方法地址的方法 3. 例例6.1 150 1000 a p 1000 1001 2000 2001 10实用精品课件PPT 2. 取内容运算符取内容运算符* 3. 注意事项注意事项 取地址运算符取地址运算符“ /*定义整型变量定义整型变量d、x和和 整型指针整型指针p*/ d=10; x=19; p= /*将变量将变量x的地址赋给指针的地址赋给指针 p*/ printf(d=%dn,*p); 1.

9、 取地址运算符取地址运算符/*定义字符型变量定义字符型变量ch1和和ch2*/ char *p1,*p2; /*定义字符型指针定义字符型指针p1和和p2*/ ch1=A; ch2=B; p1= /*指针指针p1指向变量指向变量ch1*/ p2= /*指针指针p2指向变量指向变量ch2*/ printf(%c,%cn,ch1,ch2);/*输出变量输出变量ch1 和变量和变量ch2的内容的内容*/ printf(%c,%c,*p1,*p2); /*输出指针输出指针p1 和和p2所指的存储单元的内容所指的存储单元的内容*/ 1. 取地址运算符取地址运算符 int *m;: m= 1. 赋值运算赋值

10、运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变量的运算指针变量的运算 4. 两指针变量相减两指针变量相减 16实用精品课件PPT 2. 指针中加减运算指针中加减运算 3. 指针变量的关系运算指针变量的关系运算 (2)指针变量和一般变量一样,存放在)指针变量和一般变量一样,存放在 其中的值是可以改变的,也就是说可以改其中的值是可以改变的,也就是说可以改 变指针变量的指向,例如:变指针变量的指向,例如: int i, j; int *p1; int *p2; i=c; j=d; p1= p2= 上面的程序语句也可以用下面的图来说明。上面的程序语句也可以用下面的图来说明。 1. 赋值

11、运算赋值运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变量的运算指针变量的运算 赋值运算结果赋值运算结果 4. 两指针变量相减两指针变量相减 17实用精品课件PPT 2. 指针中加减运算指针中加减运算 3. 指针变量的关系运算指针变量的关系运算 如果此时有如下的赋值表达式:如果此时有如下的赋值表达式: p2=p1; 则指针变量则指针变量p2与与p1就指向了同一个对象就指向了同一个对象i, 此时的此时的*p2就等价于就等价于i,而不再是,而不再是j了,这种了,这种 情况可以用如下的图来说明。情况可以用如下的图来说明。 1. 赋值运算赋值运算 6.2.2 指针变量的运算指针变量的运算

12、 6.2 指针变量的运算指针变量的运算 p2=p1时的情形时的情形 P1 P2 4. 两指针变量相减两指针变量相减 18实用精品课件PPT 2. 指针中加减运算指针中加减运算 3. 指针变量的关系运算指针变量的关系运算 再例如,如果执行如下的表达式:再例如,如果执行如下的表达式: *p2=*p1; 则此时表示把则此时表示把p1指向的内容赋给指向的内容赋给p2所指的所指的 区域,此时可用下图来表示情形。区域,此时可用下图来表示情形。 1. 赋值运算赋值运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变量的运算指针变量的运算 *p2=*p1时的情形时的情形 P1 P2 4. 两指针变量

13、相减两指针变量相减 19实用精品课件PPT 2. 指针中加减运算指针中加减运算 3. 指针变量的关系运算指针变量的关系运算 (3)如果需要,也可以把数组的首地址)如果需要,也可以把数组的首地址 赋予指向数组的指针变量。赋予指向数组的指针变量。 例如:例如: int a8,*pa; pa=a; 也可写为:也可写为: pa= 也可采取如下初始化赋值的方法:也可采取如下初始化赋值的方法: int a8,*pa=a; 1. 赋值运算赋值运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变量的运算指针变量的运算 4. 两指针变量相减两指针变量相减 20实用精品课件PPT 2. 指针中加减运算指

14、针中加减运算 3. 指针变量的关系运算指针变量的关系运算 (4)可以把字符串的首地址赋给指向字)可以把字符串的首地址赋给指向字 符类型的指针变量。符类型的指针变量。 例如,把字符串例如,把字符串“Hello human”赋给指针赋给指针 变量变量p,方法如下:,方法如下: char *p; p=Hello human; 或用初始化赋值的方法写为:或用初始化赋值的方法写为: char *p=Hello human; 1. 赋值运算赋值运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变量的运算指针变量的运算 4. 两指针变量相减两指针变量相减 21实用精品课件PPT 2. 指针中加减运

15、算指针中加减运算 3. 指针变量的关系运算指针变量的关系运算 对于指向数组的指针变量,可以给其加对于指向数组的指针变量,可以给其加 上或减去一个整数上或减去一个整数n。 例如,设例如,设p是指向数组是指向数组m的指针变量,则的指针变量,则 p+n,p-n,p+,+p,p-,-p都是合法都是合法 的运算表达式。的运算表达式。 给指针变量加上或减去一个整数给指针变量加上或减去一个整数n表示表示 把指针指向的当前位置(指向某数组元素)把指针指向的当前位置(指向某数组元素) 向前或向后移动向前或向后移动n个位置。个位置。 1. 赋值运算赋值运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变

16、量的运算指针变量的运算 4. 两指针变量相减两指针变量相减 22实用精品课件PPT 2. 指针中加减运算指针中加减运算 3. 指针变量的关系运算指针变量的关系运算 指向同一数组的两个指针变量进行关系指向同一数组的两个指针变量进行关系 运算可表示它们所指数组元素之间的关系。运算可表示它们所指数组元素之间的关系。 例如:例如: p1=p2; /*表示表示p1和和p2指向同一数组元指向同一数组元 素素*/ p1p2; /*表示表示p1处于高地址位置处于高地址位置*/ p1y) /*三个数进行大小比较三个数进行大小比较*/ max= min= elsemax=min= if(z*max) max= i

17、f(z*min) min= printf(the max is: %dnthe min is: %dn,*max,*min); 1. 赋值运算赋值运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变量的运算指针变量的运算 该程序的运行结果如下:该程序的运行结果如下: please input three numbers: 23 34 65 the max is: 65 the min is: 23 24实用精品课件PPT 2. 指针中加减运算指针中加减运算 4. 两指针变量相减两指针变量相减 两指针变量也可以进行相减运算,其所两指针变量也可以进行相减运算,其所 得之差是:两个指针所指

18、的数组元素之间得之差是:两个指针所指的数组元素之间 相差的元素个数,实际上是两个指针值相差的元素个数,实际上是两个指针值 (地址)相减之差再除以该数组元素的长(地址)相减之差再除以该数组元素的长 度(字节数度(字节数)。)。 例如:例如:p1和和p2 是指向同一整型数组的是指向同一整型数组的 两个指针变量,设两个指针变量,设p1的值为的值为1100H,p2的的 值为值为1050H,由于整型数组每个元素占,由于整型数组每个元素占2 个字节,所以个字节,所以p1-p2的结果为的结果为(1100H- 1050H)/2=25,因此,因此“p1-p2”表示表示p1和和 p2 之间相差之间相差25个元素。

19、个元素。 但是,但是,p1和和p2不能进行加法运算,因为不能进行加法运算,因为 指针变量相加是毫无意义的。指针变量相加是毫无意义的。 1. 赋值运算赋值运算 6.2.2 指针变量的运算指针变量的运算 6.2 指针变量的运算指针变量的运算 3. 指针变量的关系运算指针变量的关系运算 25实用精品课件PPT 2. 数组指针变数组指针变 量的说明量的说明 3. 数组名和数组指数组名和数组指 针变量作函数参数针变量作函数参数 第一,一个数组是由连续的一块内存单元组成的。第一,一个数组是由连续的一块内存单元组成的。 其中的数组名就是这块连续内存单元的首地址。其中的数组名就是这块连续内存单元的首地址。 第

20、二,一个数组也是由各个数组元素组成的。第二,一个数组也是由各个数组元素组成的。 第三,数组元素的首地址也是指它所占有的几个第三,数组元素的首地址也是指它所占有的几个 内存单元的首地址。内存单元的首地址。 1.几个数组指几个数组指 针变量的关系针变量的关系 6.3 指向数组元素的指针指向数组元素的指针 26实用精品课件PPT 2. 数组指针变数组指针变 量的说明量的说明 3. 数组名和数组指数组名和数组指 针变量作函数参数针变量作函数参数 数组指针变量说明的一般形式为:数组指针变量说明的一般形式为: 类型说明符类型说明符 *指针变量名指针变量名; 其中,其中,“类型说明符类型说明符”表示指针变量

21、所指表示指针变量所指 数组的类型;数组的类型;“*”表示其后的变量是指针表示其后的变量是指针 变量。变量。 用数组指针变量访问数组元素有两种方法:用数组指针变量访问数组元素有两种方法: 第一种方法为下标法,即用第一种方法为下标法,即用mi形式访问数形式访问数 组元素。组元素。 第二种方法为指针法,即采用第二种方法为指针法,即采用*(pm+i)形式,形式, 该方法是用间接访问的方法来访问数组元该方法是用间接访问的方法来访问数组元 素。素。 1.几个数组指几个数组指 针变量的关系针变量的关系 6.3 指向数组元素的指针指向数组元素的指针 27实用精品课件PPT 2. 数组指针变数组指针变 量的说明

22、量的说明 3. 数组名和数组指数组名和数组指 针变量作函数参数针变量作函数参数 【例例6.6】采用指针法访问数组元素。采用指针法访问数组元素。 #include main() int m5,i,*pm; pm=m; for(i=0;i5;i+) *pm=i; pm+; pm=m; for(i=0;i5;i+) printf(m%d=%dn,i,*pm); pm+; 1.几个数组指几个数组指 针变量的关系针变量的关系 6.3 指向数组元素的指针指向数组元素的指针 该程序的运行结果如下:该程序的运行结果如下: m0=0 m1=1 m2=2 m3=3 m4=4 28实用精品课件PPT 2. 数组指针

23、变数组指针变 量的说明量的说明 3. 数组名和数组指数组名和数组指 针变量作函数参数针变量作函数参数 【例【例6.7】与例】与例6.6的本意相同,但是其实现的本意相同,但是其实现 方式不同。方式不同。 #include main() int m5,i,*pm=m; for(i=0;i5;) *pm=i; printf(m%d=%dn,i+,*pm+); 1.几个数组指几个数组指 针变量的关系针变量的关系 6.3 指向数组元素的指针指向数组元素的指针 该程序的运行结果如下:该程序的运行结果如下: m0=0 m1=1 m2=2 m3=3 m4=4 29实用精品课件PPT 2. 数组指针变数组指针变

24、 量的说明量的说明 3. 数组名和数组指数组名和数组指 针变量作函数参数针变量作函数参数 数组名是数组的首地址,实参向形参传送数组名是数组的首地址,实参向形参传送 数组名实际上就是传送数组的地址,形参数组名实际上就是传送数组的地址,形参 得到该地址后也指向同一数组得到该地址后也指向同一数组。 指针变量的值也是地址,数组指针变量的指针变量的值也是地址,数组指针变量的 值即为数组的首地址,也可作为函数的参值即为数组的首地址,也可作为函数的参 数使用数使用。 1.几个数组指几个数组指 针变量的关系针变量的关系 6.3 指向数组元素的指针指向数组元素的指针 30实用精品课件PPT 2. 数组指针变数组

25、指针变 量的说明量的说明 3. 数组名和数组指数组名和数组指 针变量作函数参数针变量作函数参数 【例例6.8】编写求五门课程平均成绩的函编写求五门课程平均成绩的函 数,并编写主函数调用该函数。数,并编写主函数调用该函数。 下图所示为对应的下图所示为对应的N-S流程图。流程图。 1.几个数组指几个数组指 针变量的关系针变量的关系 6.3 指向数组元素的指针指向数组元素的指针 定义浮点型的数组sco5、变量 av 和指针 *sp sp=sco for(i=0;i5;i+) 将5门课程的成绩依次输入到scoi中 av=aver(sp) 输出平均分av的值 main函数的函数的N-S流程图流程图 定义

26、浮点型变量 av和 s for(i=0;i5;i+) s=s+*pm+ av=s/5 返回av的值 aver函数的函数的N-S流程图流程图31实用精品课件PPT 2. 数组指针变数组指针变 量的说明量的说明 3. 数组名和数组指数组名和数组指 针变量作函数参数针变量作函数参数 程序代码如下程序代码如下: #include float aver(float *pm); main() float sco5,av,*sp; int i; sp=sco; printf(n please input 5 scores:n); for(i=0;i5;i+) scanf(%f, av=aver(sp); p

27、rintf(average score is %5.2f,av); float aver(float *pm) /*函数函数aver*/ int i; float av,s=0; for(i=0;i5;i+) s=s+*pm+; av=s/5; return av; 1.几个数组指几个数组指 针变量的关系针变量的关系 6.3 指向数组元素的指针指向数组元素的指针 程序的运行结果如下:程序的运行结果如下: please input 5 scores: 90 45 56 80 100 average score is 74.20 32实用精品课件PPT 6.4 指向二维数组的指针变量指向二维数组的

28、指针变量 1. 二维数组地址二维数组地址 的表示方法的表示方法 2. 二维数组的指二维数组的指 针变量针变量 语言允许把一个二维数组分解为多个语言允许把一个二维数组分解为多个 一维数组来处理。因此二维数组一维数组来处理。因此二维数组m可分解可分解 为三个一维数组,即为三个一维数组,即m0、m1、m2。 每个一维数组又含有四个元素。每个一维数组又含有四个元素。 例如例如m0数组,含有数组,含有m00、m01、 m02、m03四个元素。四个元素。 33实用精品课件PPT 6.4 指向二维数组的指针变量指向二维数组的指针变量 1. 二维数组地址二维数组地址 的表示方法的表示方法 2. 二维数组的指二

29、维数组的指 针变量针变量 【例例6.9】用不同的方式输出同一数组元素的用不同的方式输出同一数组元素的 数据值的应用举例。数据值的应用举例。 #include main() int m34=0,1,2,3,4,5,6,7,8,9,10,11; printf(%d,%d,%d,%d,%d,n,m,*m, m0, printf(%d,%d,%d,%d,%d,n,m+1, *(m+1),m1, printf(%d,%d,%d,%d,%d,n,m+2, *(m+2),m2, printf(%d,%dn,m1+1,*(m+1)+1); printf(%d,%dn,*(m1+1),*(*(m+1)+1);

30、其运行结果如下:其运行结果如下: 404,404,404,404,404 412,412,412,412,412 420,420,420,420,420 414,414 5,5 34实用精品课件PPT 6.4 指向二维数组的指针变量指向二维数组的指针变量 1. 二维数组地址二维数组地址 的表示方法的表示方法 2. 二维数组的指二维数组的指 针变量针变量 二维数组指针变量说明的一般形式为二维数组指针变量说明的一般形式为: 类型说明符类型说明符 (*指针变量名指针变量名)长度长度; 其中其中“类型说明符类型说明符”为所指数组的数据类型。为所指数组的数据类型。 “*”表示其后的变量是指针类型。表示其

31、后的变量是指针类型。“长度长度” 表示二维数组分解为多个一维数组时,一维表示二维数组分解为多个一维数组时,一维 数组的长度,也就是二维数组的列数。数组的长度,也就是二维数组的列数。 “*(p+i)+j”是二维数组是二维数组i行行j 列的元素的地址,列的元素的地址, 而而“*(*(p+i)+j)”则是则是i行行j列元素的值。列元素的值。 35实用精品课件PPT 6.4 指向二维数组的指针变量指向二维数组的指针变量 1. 二维数组地址二维数组地址 的表示方法的表示方法 2. 二维数组的指二维数组的指 针变量针变量 【例例6.10】二维数组指针变量的应用举例。二维数组指针变量的应用举例。 main(

32、) static int m34=0,1,2,3,4,5,6,7,8,9,10,11; int (*p)4; int i,j; p=m; for(i=0;i3;I for(j=0;j4;j+) printf(%3d ,*(*(p+i)+j); 该程序的运行结果为:该程序的运行结果为: 0 1 2 3 4 5 6 7 8 9 10 11 36实用精品课件PPT 6.5 指向字符串的指针变量指向字符串的指针变量 1. 字符串的表字符串的表 示形式示形式 2. 字符串指针变量字符串指针变量 与字符数组的区别与字符数组的区别 在在C语言中,可以用两种方法访语言中,可以用两种方法访 问一个字符串。问一个

33、字符串。 (1)第一种:用字符串指针指向)第一种:用字符串指针指向 一个字符串。一个字符串。 (2)第二种:用字符数组存放一)第二种:用字符数组存放一 个字符串,然后输出该字符串。个字符串,然后输出该字符串。 37实用精品课件PPT 6.5 指向字符串的指针变量指向字符串的指针变量 1. 字符串的表字符串的表 示形式示形式 2. 字符串指针变量字符串指针变量 与字符数组的区别与字符数组的区别 【例例6.11】编程实现:把一个字符串的内容编程实现:把一个字符串的内容 复制到另一个字符串中,要求不能使用复制到另一个字符串中,要求不能使用 strcpy函数。函数函数。函数cprstr的形参为两个字符

34、的形参为两个字符 指针变量指针变量pm和和pn。其中,。其中,pm指向源字符串,指向源字符串, pn指向目标字符串。这里要注意表达式指向目标字符串。这里要注意表达式 “(*pn=*pm)!=0”的用法。的用法。 程序代码如下:程序代码如下: #include cprstr(char *pm,char *pn) /*定义字符串复定义字符串复 制函数制函数cpystr*/ while(*pn=*pm)!=0) pn+;pm+; 38实用精品课件PPT 6.5 指向字符串的指针变量指向字符串的指针变量 1. 字符串的表字符串的表 示形式示形式 2. 字符串指针变量字符串指针变量 与字符数组的区别与字

35、符数组的区别 main() char *pa=Human,b10,*pb; pb=b; cprstr(pa,pb); /*调用字符串复制函调用字符串复制函 数数cpystr*/ printf(string_a=%snstring_b=%sn ,pa,pb); 程序的输出结果为:程序的输出结果为: string_a=Human string_b=Human 39实用精品课件PPT 6.5 指向字符串的指针变量指向字符串的指针变量 1. 字符串的表字符串的表 示形式示形式 2. 字符串指针变量字符串指针变量 与字符数组的区别与字符数组的区别 简化后的程序如下所示简化后的程序如下所示: #inclu

36、de cprstr(char *pm,char *pn) while(*pn+=*pm+)!=0); main() char *pa=Human,b10,*pb; pb=b; cprstr(pa,pb); printf(string_a=%snstring_b=%s n,pa,pb); 程序的输出结果为:程序的输出结果为: string_a=Human string_b=Human 40实用精品课件PPT 6.5 指向字符串的指针变量指向字符串的指针变量 1. 字符串的表字符串的表 示形式示形式 2. 字符串指针变量字符串指针变量 与字符数组的区别与字符数组的区别 (1)在对字符数组作初始化赋

37、值时,必须)在对字符数组作初始化赋值时,必须 采用外部类型或静态类型采用外部类型或静态类型。 (2)字符串指针变量本身是一个变量,用)字符串指针变量本身是一个变量,用 于存放字符串的首地址。而字符串本身是存于存放字符串的首地址。而字符串本身是存 放在以该首地址为首的一块连续的内存空间放在以该首地址为首的一块连续的内存空间 中,并以中,并以0作为串的结束。作为串的结束。 (3)字符串指针方式可以根据需要灵活使)字符串指针方式可以根据需要灵活使 用。例如,对字符串指针方式:用。例如,对字符串指针方式: char *m=Hello Human; 可以改写为另一种方式:可以改写为另一种方式: char

38、 *m; m=Hello Human; 41实用精品课件PPT 6.6.1 指针型函数的定义方法指针型函数的定义方法 1. 定义的一般形式定义的一般形式 2.例例6.12 6.6 指针型函数指针型函数 类型说明符类型说明符 *函数名函数名(形参表形参表) 函数体函数体 其中函数名之前加了其中函数名之前加了“*”号表明号表明 这是一个指针型函数,即返回值这是一个指针型函数,即返回值 将是一个指针将是一个指针。 类型说明符表示了返回的指针类型说明符表示了返回的指针 值所指向的数据类型值所指向的数据类型。 42实用精品课件PPT 6.6.1 指针型函数的定义方法指针型函数的定义方法 1. 定义的一般

39、形式定义的一般形式 2.例例6.12 6.6 指针型函数指针型函数 【例例6.12】使用指针函数编写程序,实使用指针函数编写程序,实 现求两个数中的较大者。现求两个数中的较大者。 #include int *max(int a,int b) int *p; if(ab) p= elsep= return p; main() printf(max=%d,*(max(12,56); 43实用精品课件PPT 6.6.2 函数指针变量函数指针变量 1. 一般形式一般形式 2.例例6.13 6.6 指针型函数指针型函数 类型说明符类型说明符 (*指针变量名指针变量名)(); 上面就是函数指针变量定义的上

40、面就是函数指针变量定义的 一般形式,其中一般形式,其中“类型说明符类型说明符”表表 示被指函数的返回值的类型示被指函数的返回值的类型。 “(* 指针变量名指针变量名)”表示表示“*”后面后面 的变量是定义的指针变量。最后的变量是定义的指针变量。最后 的空括号表示指针变量所指的是的空括号表示指针变量所指的是 一个函数。例如一个函数。例如: int (*f1)(); 表示表示f1是一个指向函数入口的是一个指向函数入口的 指针变量,该函数的返回值是整指针变量,该函数的返回值是整 型。型。 3.几点注意事项几点注意事项 44实用精品课件PPT 6.6.2 函数指针变量函数指针变量 1. 一般形式一般形

41、式 2.例例6.13 6.6 指针型函数指针型函数 【例例6.13】编程实现:求两个整数中的编程实现:求两个整数中的 较小者,在程序中使用指针形式实现较小者,在程序中使用指针形式实现 对函数的调用。对函数的调用。 #include int min(int a,int b) if(ab) return a; else return b; main() int min(int a,int b); int(*pmin)(); int x,y,z; pmin=min; printf(please input two numbers:n); scanf(%d%d, z=(*pmin)(x,y); pri

42、ntf(min_number=%d,z); 程序的运行情况为:程序的运行情况为: please input two numbers: 35 23 min_number=23 3.几点注意事项几点注意事项 45实用精品课件PPT 6.6.2 函数指针变量函数指针变量 1. 一般形式一般形式 2.例例6.13 6.6 指针型函数指针型函数 (1)函数调用中)函数调用中“(*指针变量名指针变量名)”两边两边 的括号不可少,其中的的括号不可少,其中的“*”不应该理解不应该理解 为求值运算,在此处它只是一种表示符为求值运算,在此处它只是一种表示符 号号。 (2)不能让函数指针变量参与算术运)不能让函数指

43、针变量参与算术运 算,这是与数组指针变量不同的。算,这是与数组指针变量不同的。 应该特别注意的是:应该特别注意的是:函数指针变量和指函数指针变量和指 针型函数这两者在写法和意义上是有区针型函数这两者在写法和意义上是有区 别的。例如,别的。例如,float(*p)()和和float*p()是两是两 个完全不同的概念,个完全不同的概念, 3.几点注意事项几点注意事项 46实用精品课件PPT 6.7 指针数组指针数组 1. 指针数组的定义指针数组的定义 2. 指针数组中的字指针数组中的字 符串符串 指针数组定义的一般形式为:指针数组定义的一般形式为: 类型说明符类型说明符 *数组名数组名数组长度说明

44、数组长度说明 例如:例如:int *p3;定义了一个有三个元定义了一个有三个元 素的指针数组,每个数组元素(指针变素的指针数组,每个数组元素(指针变 量)都可以指向一个整型变量。量)都可以指向一个整型变量。 47实用精品课件PPT 6.7 指针数组指针数组 1. 指针数组的定义指针数组的定义 2. 指针数组中的字指针数组中的字 符串符串 【例例6.14】指针数组应用举例。指针数组应用举例。 int m33=1,2,3,4,5,6,7,8,9; int *pm3=m0,m1,m2; int *p=m0; main() int i; for(i=0;i3;i+) printf(%d,%d,%dn,

45、mi2 -i,*mi,*(*(m+i)+i); for(i=0;i3;i+) printf(%d,%d,%dn,*pmi, pi,*(p+i); 该程序的运行结该程序的运行结 果如下:果如下: 3,1,1 5,4,5 7,7,9 1,1,1 4,2,2 7,3,3 48实用精品课件PPT 6.7 指针数组指针数组 1. 指针数组的定义指针数组的定义 2. 指针数组中的字指针数组中的字 符串符串 指针数组也常用来表示一组字符串,指针数组也常用来表示一组字符串, 这时指针数组的每个元素被赋予一个这时指针数组的每个元素被赋予一个 字符串的首地址。指向字符串的指针字符串的首地址。指向字符串的指针 数组

46、的初始化更为简单数组的初始化更为简单。 例如,采用指针数组来表示一组字符例如,采用指针数组来表示一组字符 串,其初始化赋值如下串,其初始化赋值如下: char *p=Monday,Tuesday, Wednesday,Thursday, Friday,Saturday,Sunday; 完成这个初始化赋值之后,完成这个初始化赋值之后,p0即指即指 向字符串向字符串“Monday” ,p6指向指向 “Sunday”。 49实用精品课件PPT 6.8.1 一级指针和二级指针的概念一级指针和二级指针的概念 6.8 二级指针二级指针 一级指针是直接指向数据对象的指针,即其中存放的一级指针是直接指向数据对

47、象的指针,即其中存放的 是数据对象,如变量或数组元素的地址是数据对象,如变量或数组元素的地址。 二级指针是指向指针的指针,二级指针并不直接指向二级指针是指向指针的指针,二级指针并不直接指向 数据对象,而是指向一级指针的指针,也就是说,二级数据对象,而是指向一级指针的指针,也就是说,二级 指针中存放的是一级指针的地址指针中存放的是一级指针的地址。 下图下图所示是一级指针和二级指针的示意图所示是一级指针和二级指针的示意图。地址值 指针变量 (a)一级指针)一级指针 值地址地址 二级指针一级指针变量 (b)二级指针)二级指针 一级指针和二级指针的示意图一级指针和二级指针的示意图 50实用精品课件PP

48、T 6.8.2 二级指针的定义二级指针的定义 6.8 二级指针二级指针 二级指针的定义格式为二级指针的定义格式为: 存储类型存储类型 数据类型数据类型 *指针名指针名; 其中,指针名前面有两个其中,指针名前面有两个*,表示是一个二级指针。表示是一个二级指针。 例如,有以下定义例如,有以下定义: int a,*pa,*pb; pa= pb= 则指针则指针pa存放变量存放变量a的地址,即指向了变量的地址,即指向了变量a,指针,指针 pb存放一级指针存放一级指针pa的地址,即指向了的地址,即指向了pa。 因此,因此,pa是一级指针,是一级指针,pb是二级指针是二级指针。 51实用精品课件PPT 6.

49、8.3 二级指针的使用二级指针的使用 6.8 二级指针二级指针 一般情况下,二级指针必须与一级指针联合使用才有一般情况下,二级指针必须与一级指针联合使用才有 意义,不能将二级指针直接指向数据对象意义,不能将二级指针直接指向数据对象。 【例【例6.15】用二级指针访问二维数组。】用二级指针访问二维数组。 如果有如下定义如果有如下定义: int a34; int *p3,*pp; p0=a0; p1=a1; p2=a2; pp=p; 52实用精品课件PPT 6.8 二级指针二级指针 可以编制用二级指针访问二维数组的程序如下:可以编制用二级指针访问二维数组的程序如下: #include main()

50、 static int a34; static int *p3,*pp; int i,j; p0=a0;p1=a1;p2=a2;p3=a3; pp=p; printf(Please enter the number of a34:n); for(i=0;i3;i+) for(j=0;j4;j+) scanf(%d,ppi+j); for(i=0;i3;i+) for(j=0;j4;j+)printf(%5d,*(*(pp+i)+j); printf(n); 程序的运行情况为:程序的运行情况为: Please enter the number of a34: 1 2 3 4 5 6 7 8 9

51、10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 6.8.3 二级指针的使用二级指针的使用 53实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 请按水果店里的水果名字(字符的字典顺请按水果店里的水果名字(字符的字典顺 序)的顺序对水果的名字进行排序,并输序)的顺序对水果的名字进行排序,并输 出排序后的内容。出排序后的内容。 下图所示为对应的下图所示为对应的N-S流程图。流程图。 定义字符型数组nameN5存放水果的名称 定义指针数组*pointN for(j=0;jN;j+) pointj=namej point(point,N) s

52、ort(point,N) point(point,N) main函数的函数的N-S流程图流程图 定义整型变量i for (i=0; in; i+) 输出数组namei中的字符串 print函数的函数的N-S流程图流程图 54实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 请按水果店里的水果名字(字符的字典顺请按水果店里的水果名字(字符的字典顺 序)的顺序对水果的名字进行排序,并输序)的顺序对水果的名字进行排序,并输 出排序后的内容。出排序后的内容。 下图所示为对应的下图所示为对应的N-S流程图。流程图。 定义字符型指针变量temp for(i=0; in-

53、1; i+) k=i for(j=i+1; j0 ? 真假 k=j k!=i ? 真假 temp=namei namei=namek namek=temp sort函数的函数的N-S流程图流程图 55实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 #include #include #define N 6 /*定义水果种类的数目,定义水果种类的数目, 假设为假设为6种种*/ void sort(char *name,int); /*排序函数排序函数 sort的说明的说明*/ void print(char *name,int); /*输出函输出函 数数pr

54、int的说明的说明*/ main() static char nameN80=“ orange, banana, apple, peach, grape, tomato;/*定义二维定义二维 数组存放水果的名称数组存放水果的名称*/ 56实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 char *pointN; /*定义指针数组定义指针数组 */ int j; for(j=0;jN;j+) pointj=namej; /*指针数组指向二维数组各行的首地址指针数组指向二维数组各行的首地址 */ printf(The name of fruit before

55、sorted:n); print(point,N); /*输出排序前的输出排序前的 水果名水果名*/ sort(point,N); /*调用函数调用函数sort对对 水果名按字典的顺序进行排序水果名按字典的顺序进行排序*/ printf(nThe name of fruit after sorted:n); print(point,N); /*输出排序后的输出排序后的 水果名水果名*/ 57实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i

56、n-1;i+) k=i; for(j=i+1;j0) k=j; if(k!=i) temp=namei; namei=namek; namek=temp; 58实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 void print(char *name,int n) /*定义输出函定义输出函 数数print*/ int i; for(i=0;in;i+) printf(%sn,namei); 程序运行结果为:程序运行结果为: The name of fruit before sorted: orange banana apple peach grape to

57、mato The name of fruit after sorted: Apple banana grape orange peach tomato 59实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 用指针数组求两个矩阵用指针数组求两个矩阵a,b的和,将结的和,将结 果存入果存入a,并按矩阵的形式输出。,并按矩阵的形式输出。 程序代码如下:程序代码如下: #include #define ROW 4 /*定义矩阵的行数,假设定义矩阵的行数,假设 为为4*/ #define COL 5 /*定义矩阵的列数,假设定义矩阵的列数,假设 为为5*/ main(

58、) /*定义二维数组定义二维数组a并赋初值并赋初值*/ int ROWCOL= 9,22,76,59,10, 80,90,47,35,12, 16,81,50,29,23, 45,57,89,12,15 ; 60实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 /*定义二维数组定义二维数组b并赋初值并赋初值*/ int bROWCOL= 23,10,17,49,0, 53,17,75,67,5, 69,87,60,21,7, 13,25,37,49,50 ; int *p2; /*定义指针数组定义指针数组*/ int i,j; p0=a0; p1=b0; p

59、rintf(matrix a%d%d is :n,ROW,COL); for(i=0;iROW;i+) for(j=0;jCOL;j+) printf(“ %d,*(p0+j+COL*i); printf(n); 61实用精品课件PPT 6.9 程序举例程序举例 1. 实例一实例一 2. 实例二实例二 printf(matrix b%d%d is:n,ROW,COL); for(i=0;iROW;i+) for(j=0;jCOL;j+) printf(%d,*(p1+j+COL*i); printf(n); printf(The sum of the two matrix is:n); for

60、(i=0;iROW;i+) for(j=0;jCOL;j+) *(p0+j+COL*i )+=*(p1+j+COL*i); printf(%d,*(p0+j+COL*i); printf(n); 程序的输出结果为:程序的输出结果为: matrix a45 is: 9 22 76 59 10 80 90 47 35 12 16 81 50 29 23 45 57 89 12 15 matrix b45 is: 23 10 17 49 0 53 17 75 67 5 69 87 60 21 7 13 25 37 49 50 The sum of the two matrix is: 32 32 9

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论