《语言指针讲解.pptx》由会员分享,可在线阅读,更多相关《语言指针讲解.pptx(102页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、l l 主要内容 10.1 10.1 地址和指针的概念地址和指针的概念 10.2 10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量 10.3 10.3 通过指针引用数组通过指针引用数组 10.4 10.4 通过指针字符串通过指针字符串 10.5 10.5 指向函数的指针指向函数的指针 10.6 10.6 返回指针值的函数返回指针值的函数 10.7 10.7 指针数组和多重指针指针数组和多重指针 10.8 10.8 动态内存分配与指向它的指针变量动态内存分配与指向它的指针变量第1页/共102页 10.1地址和指针的概念 内存区的每一个字节有一个编号,这就是内存区的每一个字节
2、有一个编号,这就是内存区的每一个字节有一个编号,这就是内存区的每一个字节有一个编号,这就是“地址地址地址地址”。如果在程序中。如果在程序中。如果在程序中。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。元。元。元。、按变量地址存取变量值的方式称为、按变量地址存取变量值的方式称为“直接访问直接访问”方式方式 (,);,);(,);,);第2页/共102页第3页/共102页2.
3、2.另一种存取变量值的方式称为另一种存取变量值的方式称为“间接访问间接访问”的方式。即,将变量的地址存放在的方式。即,将变量的地址存放在另一个变量中。另一个变量中。在语言中,指针是一种特殊的变量,它是存放地址的。在语言中,指针是一种特殊的变量,它是存放地址的。第4页/共102页一个变量的地址称为该变量的一个变量的地址称为该变量的一个变量的地址称为该变量的一个变量的地址称为该变量的“指针指针”。例如,地址例如,地址例如,地址例如,地址2000200020002000是变量的指针。如果有一个变量专门用来存放另一变量的是变量的指针。如果有一个变量专门用来存放另一变量的是变量的指针。如果有一个变量专门
4、用来存放另一变量的是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为地址(即指针),则它称为地址(即指针),则它称为地址(即指针),则它称为“指针变量指针变量”。上述的。上述的。上述的。上述的i_pointeri_pointeri_pointeri_pointer就是一就是一就是一就是一个指针变量。个指针变量。个指针变量。个指针变量。指针和指针变量的定义:第5页/共102页10.2 变量的指针和指向变量的指针变量10.10.1.1 怎样定义指针变量怎样定义指针变量定义指针变量的一般形式为定义指针变量的一般形式为基类型基类型 *指针变量名;指针变量名;第6页/共102页下
5、面都是合法的定义:下面都是合法的定义:float *pointer_float *pointer_;char*pointer_char*pointer_;可以用赋值语句使一个指针变量得到另一个变可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。量的地址,从而使它指向一个该变量。例如:例如:pointer_pointer_;pointer_pointer_;第7页/共102页在定义指针变量时要注意两点:在定义指针变量时要注意两点:(1)指针变量前面的指针变量前面的指针变量前面的指针变量前面的“*”“*”,表示该变量的类型为指针型,表示该变量的类型为指针型,表示该变量的类型
6、为指针型,表示该变量的类型为指针型变量。变量。变量。变量。例例例例:float *pointer_1float *pointer_1;指针变量名是指针变量名是指针变量名是指针变量名是pointer_1pointer_1 ,而不是,而不是,而不是,而不是*pointer_1pointer_1 。(2)(2)在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型。需要特别注意的是,只有整型变量的地址才能放到指向需要特别注意的是,只有整型变量的地址才能放到指向需要特别注意的是,只有整型变量的地址才能放到指向需要特别注意的是,只有
7、整型变量的地址才能放到指向整型变量的指针变量中。下面的赋值是错误的整型变量的指针变量中。下面的赋值是错误的整型变量的指针变量中。下面的赋值是错误的整型变量的指针变量中。下面的赋值是错误的 float a;float a;int *pointer_1;int *pointer_1;pointer_1=&a;pointer_1=&a;第8页/共102页在对指针变量赋值时需要注意两点:在对指针变量赋值时需要注意两点:指针变量中只能存放地址(指针),不要将一个指针变量中只能存放地址(指针),不要将一个指针变量中只能存放地址(指针),不要将一个指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变
8、量。整数赋给一个指针变量。整数赋给一个指针变量。整数赋给一个指针变量。例例例例:*pointer_1*pointer_1;/*pointer_1/*pointer_1是指针是指针是指针是指针变量变量变量变量,是整数,不合法是整数,不合法是整数,不合法是整数,不合法*/(2)(2)赋给指针变量的变是量地址不能是任意的类型,赋给指针变量的变是量地址不能是任意的类型,赋给指针变量的变是量地址不能是任意的类型,赋给指针变量的变是量地址不能是任意的类型,而只能是与指针变量的基类型具有相同类型的变而只能是与指针变量的基类型具有相同类型的变而只能是与指针变量的基类型具有相同类型的变而只能是与指针变量的基类型
9、具有相同类型的变量的量的量的量的地址。地址。地址。地址。第9页/共102页在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:在引用指针变量时,可能有三种情况:给指针变量赋值。如:给指针变量赋值。如:给指针变量赋值。如:给指针变量赋值。如:p=&a;p=&a;引用指针变量的值。如:引用指针变量的值。如:引用指针变量的值。如:引用指针变量的值。如:printf(“%o”,p);printf(“%o”,p);引用指针变量指向的变量。引用指针变量指向的变量。引用指针变量指向的变量。引用指针变量指向的变量。有关的两个运算符:有关的两个运算符:有关的两个
10、运算符:有关的两个运算符:(1)取地址运算符。取地址运算符。取地址运算符。取地址运算符。&a&a是变量是变量是变量是变量a a的地址。的地址。的地址。的地址。(2)*指针运算符指针运算符指针运算符指针运算符 (或称(或称(或称(或称“间接访问间接访问间接访问间接访问”运算符),运算符),运算符),运算符),*p p是指针变量是指针变量是指针变量是指针变量p p指向的对象的值。指向的对象的值。指向的对象的值。指向的对象的值。10.2.2 10.2.2 怎样引用指针变量怎样引用指针变量第10页/共102页例10.通过指针变量访问整型变量#include#include voidvoidmain()
11、main()int int,;,;intint *pointer_*pointer_,*pointer_pointer_;pointer_pointer_;/*/*把变量的地址赋给把变量的地址赋给 pointer_1*/pointer_1*/pointer_ pointer_;/*/*把变量的地址赋给把变量的地址赋给 pointer_pointer_*/printf printf(%,%,););printfprintf(%,%,*pointer_,*pointer_,*pointer_,*pointer_););第11页/共102页第12页/共102页例例10.2 10.2 输入和两个整数,
12、按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#include#include void mainvoid main()()int*int*1 1,*2 2,*,;,;scanfscanf(,);,);1 1;if if()();printfprintf(=,=,););printfprintf(max=max=,min=,min=,*,*1,*1,*2 2););第13页/共102页运行情况如下:,当输入,时,由于,将和交换。交换前的情况见图(),交换后见图()。第14页/共102页第15页/共102页10.10.3.3 指针变量作为函数参数指针变量作为函数参数例例10.
13、3 10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#include#include void mainvoid main()()void swapvoid swap(int*int*,int*int*);int int,;,;int*pointer_int*pointer_,*pointer_pointer_;scanfscanf(,);,);pointer_pointer_ ;pointer_2 pointer_2;if if(swapswap(pointer_pointer_ ,pointer_2 pointer_2););printfprintf(,);,);第1
14、6页/共102页void swapvoid swap(int*int*,int*int*)int tempint temp;temptemp*1 1;*;*temptemp;第17页/共102页第18页/共102页例例10.10.输入输入3 3个整数个整数,,要求按大小顺序将它们输出。,要求按大小顺序将它们输出。用函数实现改变这用函数实现改变这3 3个变量的值。个变量的值。#include#include void mainvoid main()()void exchangevoid exchange(int*int*1 1,int*int*2 2,int*int*3 3);int int ,
15、*,*,*;scanfscanf(%,%,%,&,&,&,&,&););exchange exchange(,);(,);printfprintf(,););第19页/共102页void exchangevoid exchange(int*int*,int*int*,int*int*)void swapvoid swap(int*int*,int*int*);if if(*)swapswap(,);(,);if if(*)swapswap(,);(,);if if(*swapswap(,);(,);void swapvoid swap(int*int*,int*int*)int tempint
16、 temp;temptemp*;*;*temptemp;第20页/共102页 10.3 10.3 通过指针引用数组通过指针引用数组一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指数组元素的指针就是数组元素的地址针就是数组元素的地址。10.3.1 10.3.1 数组
17、元素的指针数组元素的指针第21页/共102页可以可以用一个指针变量指向一个数组元素。用一个指针变量指向一个数组元素。例如:例如:;(定义为包含个整型数据的数组定义为包含个整型数据的数组)*;(定义为指向整型变量的指针变量定义为指向整型变量的指针变量);(把元素的地址赋给指针变量把元素的地址赋给指针变量)也就是使指向数组的第号元素也就是使指向数组的第号元素 。第22页/共102页第23页/共102页语言规定在指针指向数组元素时,可以对指针进行以下运算:语言规定在指针指向数组元素时,可以对指针进行以下运算:加一个整数加一个整数(用用+或或+=)+=),如,如p+1p+1 减一个整数减一个整数(用用
18、-或或-=)-=),如,如p-1p-1 自加运算,如自加运算,如p+p+,+p+p 自减运算,如自减运算,如p-p-,-p-p 两个指针相减,如两个指针相减,如p1-p2(p1-p2(只有只有p1p1和和p2p2都指向同一数组中的元素时才都指向同一数组中的元素时才有意义有意义)。10.3.2 10.3.2 指针的运算指针的运算第24页/共102页分别说明如下:分别说明如下:(1)(1)如果指针变量如果指针变量p p已指向数组中的一个元素,则已指向数组中的一个元素,则指向同一数组中的下一个元素,指向同一数组中的下一个元素,-指向同一数组中指向同一数组中的上一个元素。的上一个元素。(2)(2)如果
19、如果p p原来指向原来指向a0a0,执行,执行+p+p后后p p的值改变了,在的值改变了,在p p的原值基础上加的原值基础上加d d,这样,这样p p就指就指向数组的下一个元素向数组的下一个元素a1a1。(3)(3)如果的初值为如果的初值为 ,则和就是数组元素的地址,或者,则和就是数组元素的地址,或者说,它们指向数组的第说,它们指向数组的第个元素个元素 。(4)(4)*()或()或*()是或所指向的数组元素,即。()是或所指向的数组元素,即。(5)(5)如果指针变量如果指针变量p1p1和和p2p2都指向同一数组,如执行都指向同一数组,如执行p2-p1p2-p1,结果是两个地址之差除以数,结果是
20、两个地址之差除以数组元素的长度。组元素的长度。第25页/共102页10.10.3.3 通过指针引用数组元素通过指针引用数组元素 引用一个数组元素,可以用:引用一个数组元素,可以用:()()下标法,如形式;下标法,如形式;()()指针法,如指针法,如*()或()或*()()。其中是数组名,是指向数组。其中是数组名,是指向数组元素的指针变量,其初值。元素的指针变量,其初值。例例10.5 10.5 输出数组中的全部元素输出数组中的全部元素 假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:第26页/共102页(1)(1)下标法下标
21、法下标法下标法#include#include void mainvoid main()()()()int int;intint;forfor(;)(;)(;)(;)scanfscanf(,);,);,);,);printfprintf(););););forfor(;)(;)(;)(;)printfprintf(,);,);,);,);第27页/共102页(2)(2)通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。通过数组名计算数组元素地址,找出元素的值。#include#include voidvoidmainm
22、ain()()()()int int;int int;forfor(;(;(;(;)scanfscanf(,);,);,);,);printfprintf(););););forfor(;)(;)(;)(;)printfprintf(,*();();();();第28页/共102页(3)(3)用指针变量指向数组元素。用指针变量指向数组元素。#include#include void mainvoid main()()int int;int *int *,;,;forfor(;)(;)scanfscanf(,);,);printfprintf(););forfor(;();)(;();)prin
23、tfprintf(,*););第29页/共102页例例10.10.通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。#include#include void mainvoid main()()intint *,;,;forfor(;(;)scanfscanf(,);,);printfprintf(););forfor(;,(;,)printfprintf(,*););程序运行情况:程序运行情况:1 2 3 4 5 6 7 10 9 01 2 3 4 5 6 7 10 9 0 22153 234 0 0 30036 25202 11631 10259 10237 2104103221
24、53 234 0 0 30036 25202 11631 10259 10237 2104103显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值 第30页/共102页#include#include void void mainmain()()intint *,;,;forfor(;)(;)scanfscanf(,);,);printgprintg(););p=a;p=a;forfor(;,(;,)printfprintf(,*););程序运行情况:程序运行情况:1 2 3 4 5 6 7 10 9 01 2 3 4 5 6 7 10 9 0 1 2 3 4 5 6 7
25、 10 9 01 2 3 4 5 6 7 10 9 0第31页/共102页10.3.4 10.3.4 用数组名作函数参数用数组名作函数参数在第在第7 7章中介绍过可以用数组名作函数的参数。章中介绍过可以用数组名作函数的参数。如:如:void mainvoid main()()i i(int arrint arr,int int);int array int array;(arrayarray,);,);void void(int arr(int arr,int int)第32页/共102页例10 将数组中个整数按相反顺序存放第33页/共102页#include#include void mai
26、nvoid main()()void invvoid inv(int int ,int int);int int,;,;printfprintf(The original array:The original array:););forfor(;)(;)printf printf(,);,);printfprintf(););inv inv(,);(,);printfprintf(The array has been in vertedThe array has been in verted:););forfor(;)(;)printf printf(,);,);printf printf()
27、;);第34页/共102页void invvoid inv(int int ,int int)/*/*形参形参x x是数组名是数组名*/int tempint temp,();,();forfor(;)(;);temptemp;temptemp;returnreturn;运行情况如下:运行情况如下:The original arrayThe original array:,The array has been invertedThe array has been inverted:,第35页/共102页第36页/共102页#include#include void mainvoid main(
28、)()void invvoid inv(int*int*,int int);int int,;,;printfprintf(The original array:The original array:););forfor(;)(;)printf printf(,);,);printf printf(););invinv(,);(,);printf printf(The array has been in vertedThe array has been in verted:););forfor(;)(;)printf printf(,);,);printf printf(););对刚才的程序可
29、以作一些改动。将函数对刚才的程序可以作一些改动。将函数invinv中的形参中的形参改成指针变量。改成指针变量。第37页/共102页void invvoid inv(int*int*,int int)/*/*形参形参x x为指针变量为指针变量*/intint ,temptemp,*,*,();,();forfor(;,)(;,)empemp*;*;*temptemp;returnreturn;第38页/共102页如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:形参的对应关系有以下种情况:(1)(1
30、)形参和实参都用数组名,如:形参和实参都用数组名,如:形参和实参都用数组名,如:形参和实参都用数组名,如:void mainvoid main()()()()void void (int int ,int int)int int;(,);(,);(,);(,);第39页/共102页第40页/共102页(2)(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void void()()()()void void(int*int*,int int)int int ;(,);(,);(,);(,);(3)(3)
31、实参形参都用指针变量。例如:实参形参都用指针变量。例如:实参形参都用指针变量。例如:实参形参都用指针变量。例如:void void mainmain()()()()void void(int*int*,int int)int int,*p=a;,*p=a;(p p,);,);,);,);第41页/共102页第42页/共102页(4)(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void mainvoid main()()()()void void(int x int x,int int),*p=a,
32、*p=a;(p p,);,);,);,);第43页/共102页#include#include void mainvoid main()()void inv void inv(int*int*,int int);int int,*;printfprintf(The original array:n The original array:n););forfor(;,)(;,)scanfscanf(,);,);printfprintf(););invinv(,);(,);/*/*实参为指针变量实参为指针变量*/printf printf(The array has been inverted Th
33、e array has been inverted:););forfor(;(;)printfprintf(,*););printfprintf(););例108 用实参指针变量改写例10.。第44页/共102页void invvoid inv(int*int*,int int)intint ,temptemp,*,*;();();forfor(;,)(;,)empemp*;*;*temptemp;returnreturn;第45页/共102页例例10109 9 用选择法对个整数按由大到小顺序排序用选择法对个整数按由大到小顺序排序#include#include void mainvoid m
34、ain()()void sort void sort(int int ,int int);int int *,1010;forfor(;)(;)scanfscanf(,);,);sortsort(,);(,);forfor(,;)(,;)(,*););第46页/共102页void sortvoid sort(int int ,int int)int int,;,;forfor(;)(;);forfor(;)(;)()();(!)(!);第47页/共102页10.3.5 10.3.5 通过指针引用多维数组通过指针引用多维数组用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念
35、用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。上和使用上,多维数组的指针比一维数组的指针要复杂一些。1.1.1.1.多维数组元素的地址多维数组元素的地址先回顾一下多维数组的性质先回顾一下多维数组的性质,可以认为二维数组是可以认为二维数组是“数组的数组数组的数组”,例,例 :定义定义int aint a3 34 4=1=1,3 3,5 5,77,;则二维数组则二维数组a a是由是由3 3个一维数组所组成的。设二维数组的首行的首地址为个一维数组所组成的。设二维数组的首行的首地址为 ,则,则第48页/共102页表表 示示
36、 形形 式式含义含义地地 址址a a a a 二维数组名,指向一维数组二维数组名,指向一维数组二维数组名,指向一维数组二维数组名,指向一维数组a0a0a0a0,即,即,即,即0 0 0 0行首地址行首地址行首地址行首地址2000200020002000a0a0a0a0,*(a+0),*(a+0),*(a+0),*(a+0),*a*a*a*a0 0 0 0行行行行0 0 0 0列元素地址列元素地址列元素地址列元素地址2000200020002000a+1a+1a+1a+1,&a&a&a&a1 1 1 11 1 1 1行首地址行首地址行首地址行首地址20010200102001020010a a
37、a a1 1 1 1,*(a+1),*(a+1),*(a+1),*(a+1)1 1 1 1行行行行0 0 0 0列元素列元素列元素列元素a10a10a10a10的地址的地址的地址的地址20010200102001020010a1+2,a1+2,a1+2,a1+2,*(a+1)+2,*(a+1)+2,*(a+1)+2,*(a+1)+2,&a12&a12&a12&a121 1 1 1行行行行2 2 2 2列元素列元素列元素列元素a12 a12 a12 a12 的地址的地址的地址的地址2012201220122012*(a1+2),*(a1+2),*(a1+2),*(a1+2),*(*(a+1)+2
38、),*(*(a+1)+2),*(*(a+1)+2),*(*(a+1)+2),a12a12a12a121 1 1 1行行行行2 2 2 2列元素列元素列元素列元素a a a a1 1 1 12 2 2 2的值的值的值的值元素值为元素值为元素值为元素值为13131313第49页/共102页2.2.2.2.指向多维数组元素的指针变量指向多维数组元素的指针变量(1)(1)指向数组元素的指针变量指向数组元素的指针变量例例例例10.10 10.10 10.10 10.10 用指向元素的指针变量输出二维数组元素的值用指向元素的指针变量输出二维数组元素的值用指向元素的指针变量输出二维数组元素的值用指向元素的指
39、针变量输出二维数组元素的值#include#include void mainvoid main()()int int 34341,3,5,7,9,11,13,15,17,19,21,231,3,5,7,9,11,13,15,17,19,21,23;intint *;forfor(;)(;)()()printfprintf(););printfprintf(,*););运行结果如下:运行结果如下:1 3 5 71 3 5 7 9 11 13 15 9 11 13 1519 21 23 19 21 23 第50页/共102页(2)(2)用指向由个元素组成的一维数组的指针变量用指向由个元素组成的一
40、维数组的指针变量 例例例例10.11 10.11 10.11 10.11 输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值#include#include void main()void main()int int 1 1,3 3,5 5,7 7,9 9,1111,1313,1515,;,;int int(*),;),;scanfscanf(,);,);printfprintf(,*(*();();运行情况如下:运行情况如下:,(本行为键盘输入)(本行为键盘输入),第51页/共102页3.3.用指向数组的指针作函数
41、参数用指向数组的指针作函数参数例例10.12 10.12 10.12 10.12 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数用函数averageaverageaverageaverage求总平均成绩,用函数求总平均成绩,用函数searchsearchsearchsearch找出并输出第个学生的成绩。找出并输出第个学生的成绩。第52页/共102页#include#incl
42、ude void mainvoid main()()void average void average(float*pfloat*p,int nint n););void searchvoid search(float(*pfloat(*p)4 4,int n)int n);float scorefloat score3 34 4=65=65,6767,7070,6060,100100,107107,9090,101101,9090,9999,100100,910;910;average average(*scorescore,1212););*求求1212个分数的平均分个分数的平均分*sea
43、rchsearch(scorescore,);,);*求序号为的学生的成绩求序号为的学生的成绩*第53页/共102页void averagevoid average(float*float*,int int)float float *_ _;float sumfloat sum,averaver;p_endp_end;forfor(;(;_ _;);)sumsumsumsum(*););averaversumsum;printfprintf(averageaverage,averaver););第54页/共102页void searchvoid search(float(*float(*)4)
44、4,int int)/*p/*p是指向具有是指向具有4 4个元素的一维数组的指针个元素的一维数组的指针*/int int;printfprintf(the score of No.%the score of No.%areare:,);,);forfor(;(;)printf printf(5.25.2,*(*();();程序运行结果如下:程序运行结果如下:averageaverage1010The score of No.2 areThe score of No.2 are:.10.10.第55页/共102页例例10.10.3 3 在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全
45、部课在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。程的成绩。#include#include void mainvoid main()()void searchvoid search(float(*p)float(*p)4 4,int nint n););/*/*函数声明函数声明*/float score34=65 float score34=65,5757,7070,6060,510510,107107,9090,101101,9090,9999,100100,910;910;search search(scorescore,);,);第56页/共102页void
46、 searchvoid search(float(*p)float(*p)4 4,int int)int int,;,;forfor(;(;)flagflag;forfor(;(;)if if(*(*()())flagflag;if if()()printf(No.%d fails printf(No.%d fails,his scores are:his scores are:nn,j+1);j+1);forfor(;)(;)printfprintf(%.,*(*(*();printfprintf(););程序运行结果如下:程序运行结果如下:No.1 fails,his scores are
47、No.1 fails,his scores are:.No.2 fails,his scores areNo.2 fails,his scores are:10.10.1010.1010.第57页/共102页 10.10.通过指针引用字符串通过指针引用字符串10.4.10.4.字符串的表示形式字符串的表示形式 例例 10.14 10.14 定义一个字符数组,对它初始化,定义一个字符数组,对它初始化,然后输出该字符串然后输出该字符串#include#include void mainvoid main()()char stringchar stringI love ChinaI love Chi
48、na!;printfprintf(,stringstring););(1)(1)用字符数组存放一个字符串,然后输出该字符串。用字符数组存放一个字符串,然后输出该字符串。第58页/共102页(2)(2)用字符指针指向一个字符串用字符指针指向一个字符串可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。例例10.15 10.15 定义字符指针,使它指向一个字符串。定义字符指针,使它指向一个字符串。#include#include void mainvoid main()()charchar stringstri
49、ng I love China I love China!;printfprintf(,);,);第59页/共102页例例例例10.16 10.16 10.16 10.16 将字符串复制为字符串将字符串复制为字符串将字符串复制为字符串将字符串复制为字符串#include#include void void()()char char am a boyam a boy,2020;int int;forfor(;(;*()!()!;);)*()()*();();*()();printfprintf(string a is string a is:,);,);printfprintf(string b
50、 isstring b is:););forfor(;!(;!;);)printfprintf(,);,);printfprintf(););第60页/共102页也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。例例10.17 10.17 用指针变量来处理例用指针变量来处理例10.1610.16问题。问题。#include#include void mainvoid main()()char char =I am a boy.=I am a boy.,2020,*p1p1,*p2p2;int int;forfor(;(;*!