小学教师专业标准吴伦敦

上传人:痛*** 文档编号:64552247 上传时间:2022-03-21 格式:PPT 页数:81 大小:1.26MB
收藏 版权申诉 举报 下载
小学教师专业标准吴伦敦_第1页
第1页 / 共81页
小学教师专业标准吴伦敦_第2页
第2页 / 共81页
小学教师专业标准吴伦敦_第3页
第3页 / 共81页
资源描述:

《小学教师专业标准吴伦敦》由会员分享,可在线阅读,更多相关《小学教师专业标准吴伦敦(81页珍藏版)》请在装配图网上搜索。

1、语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 第第 九九 章章指指 针针9.1 指针的概念指针的概念9.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量9.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量9.4 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量9.5 函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量9.6 返回指针值的函数返回指针值的函数 9.7 指针数组和指向指针的指针指针数组和指向指针的指针9.8 指针小结指针小结9.9 动态内存分配动态内存分配语

2、语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 第九章第九章 指指 针针本章要点:本章要点:了解地址与指针的概念了解地址与指针的概念熟练掌握指针变量的定义、初始化及指针的运熟练掌握指针变量的定义、初始化及指针的运算算 掌握指针与数组、指针数组、二级指针等知识掌握指针与数组、指针数组、二级指针等知识 熟练掌握字符串的指针与指向字符串的指针变熟练掌握字符串的指针与指向字符串的指针变量量了解指针与函数的概念了解指针与函数的概念 掌握指针作为函数参数的应用掌握指针作为函数参数的应用了解多维数组指针的概念了解多维数组指针的概念 语语语语语语言言

3、言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 指针指针是是C语言中最重要的组成部分。利语言中最重要的组成部分。利用用指针指针可以表示可以表示:复杂的数据结构;动态分配复杂的数据结构;动态分配内存;灵活处理字符串和数组;直接处理内内存;灵活处理字符串和数组;直接处理内存地址;从函数调用中获取多个值等。存地址;从函数调用中获取多个值等。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章对变量值的存取实质上是通过对变量值的存取实质上是通过地址地址进行的。进行的。示意图示意图9.1 指针的概念指针

4、的概念 C 语言中,任何一个语言中,任何一个变量名变量名实质上都代表着内实质上都代表着内存中的某一个存储单元,每一个存储单元都有一个存中的某一个存储单元,每一个存储单元都有一个地址地址。C系统能自动将系统能自动将变量名变量名和它的和它的地址地址联系起来。联系起来。变量定义及内存分配实例变量定义及内存分配实例对变量的两种访问方式:对变量的两种访问方式:直接访问直接访问 和和 间接访问间接访问 int i , j , k; i = 3; j = 6; k = 9;则编译时系统分别为则编译时系统分别为 i , j , k 各分配各分配 2 个字节个字节。 如如: 2000 , 2001 i 2002

5、 , 2003 j 2004 , 2005 k 内存用户数据区内存用户数据区36920002000200220043010 变量变量 i变量变量 j变量变量 k变量变量 i_ pointer 如如: int i = 3 ; printf ( “ %d ” , i ) ; 执行是:执行是:根据变量名根据变量名 i 找到找到 i 的地的地址址 ( 如如: 2000 ),然后,然后 从地址从地址 2000 开始开始的两个字节中取出数据(即变量的值的两个字节中取出数据(即变量的值 3),),再将其输出。这种据变量名按变量地址存再将其输出。这种据变量名按变量地址存取变量的值的取变量的值的 方式叫方式叫

6、“ 直接访问直接访问 ”方方式。式。 2000i3 int i = 3 ; 表示将表示将 3 送送到变量到变量i 所占的内存单元中所占的内存单元中 C 语言允许定义和使用一种特殊的变量,语言允许定义和使用一种特殊的变量,这种变量专门用于存放其它变量的这种变量专门用于存放其它变量的地址地址。如前。如前面的变量面的变量 i_ pointer 。如。如 果把变量果把变量 i 的地址赋的地址赋给给i_ pointer , 即即 i_ pointer = &i。这。这 样就可样就可以通过变量以通过变量 i_ pointer 获取变量获取变量 i 的地址,的地址, 然然后再后再 取出取出 i 的值。这种方

7、式叫的值。这种方式叫 “间接访问间接访问”方式。如图所示方式。如图所示: 2000 2000i_pointer3 将将3送到变量送到变量 i_pointer 所所指向指向 的内存单元中的内存单元中i语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 指针指针: 一个变量的一个变量的地址地址叫该变量的叫该变量的 “ “ 指针指针 ” ”。 指针变量指针变量: 用于存放其它变量的用于存放其它变量的地址地址的变量。的变量。 指向指向:如如 i_pointer= &i ,就称,就称i_pointer指向变量指向变量 i 目标变量目标变量: 指针

8、变量所指向的变量。指针变量所指向的变量。有关指针的几个概念:有关指针的几个概念:语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章说明说明: 1. 类型说明符类型说明符表示指针变量所指向的变量的类型,表示指针变量所指向的变量的类型, 同类型变量的地址才能放到指向该类型变量的同类型变量的地址才能放到指向该类型变量的指指 针变量中。针变量中。例如例如2. 不能把一个不能把一个整型量整型量或其它或其它非地址非地址类型的数据赋类型的数据赋给给 一个指针变量。一个指针变量。例如例如示例一示例一 实例二实例二9.2 变量的变量的指针指针和指向变量的

9、和指向变量的指针变量指针变量 一、指针变量的定义一、指针变量的定义格式格式: 类型说明符类型说明符 * 标识符标识符如:如: int *pointer_1, *pointer_2 ; float *fp1 , *fp2 ;&i&j pointer_1pointer_2 i j如如: int i, j, *pointer_1, *pointer_2 ; 若若: pointer_1 = &i; pointer_2 = &j ; float f1 ; int *p ;p = &f1 ; (不正确不正确)如如: int *p ; p = 100 ; (不合法不合法)但但: p=NULL 或或 p=0

10、或或 p=0 合法,合法,表示为指针变量赋表示为指针变量赋“空值空值”,含义是,含义是: p 不指向任何单元。不指向任何单元。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章二、指针变量的引用二、指针变量的引用例例 9.1 通过指针变量访问整型变量通过指针变量访问整型变量 main ( ) int a , b ; int *p1 , *p2 ; a = 100 ; b = 10 ; p1 = &a ; p2 = &b ; printf(“%d, %dn”, ) ; printf(“%d,%dn”, ); &a&b10010p1p2 a

11、 b*p1*p2“直接访问直接访问”方式方式“间接访问间接访问”方式方式, *p1 表示指表示指针变量针变量 p1所指向的变量,即所指向的变量,即 a运行结果运行结果分析分析结果结果: 100, 10 100, 10语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章关于关于 & 与与 * 运算符的说明运算符的说明: 1. & 是取地址运算符是取地址运算符, 如如: &a, &b等。等。 定义时,定义时,* 是指针运算符,用于表示其后的是指针运算符,用于表示其后的标标 识符识符是是指针变量指针变量。但在程序中,。但在程序中,*p 则表示指

12、针变则表示指针变量量 p 所指向的变量,即所指向的变量,即目标变量目标变量。 2. & , * , + + , 同优先级,同优先级, 按从按从右至左方右至左方向向结合。结合。 示例示例1 示例示例2 示例示例3 如如: int a , *p1 , *p2 ; p1 = &a ; 则:则: &*p1 与与 &a 等效等效 若:若: p2 = &*p1 ; 或或 p2 = &a ; 则则: p2 也指向变量也指向变量 a 如如: int a , *p1 ; p1 = &a ; 则则: *&a 与与 *p1 等效,等价于变量等效,等价于变量 a。 &ap1p1* *p1p1*&a a 如如: int

13、 a , *p1 ; p1 = &a ; 则则: (*p1)+ 等价于等价于 a+ 注意注意: *p1+ 不等价于不等价于 (*p1)+因为因为: *p1+ 等价于等价于 *( p1+ ) 即即:先得先得 p1 所指向变量的所指向变量的值值,再使指针,再使指针变量变量 p1的值自增的值自增。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章程序运行程序运行注意事项注意事项数据指针交换示意图数据指针交换示意图 例例 9.2 输入两个数,按从大到小的顺序输出。输入两个数,按从大到小的顺序输出。 main ( ) int *p1 , *p2

14、, *p , a , b ; scanf(“ %d , %d ” , &a , &b ) ; p1 = &a ; p2 = &b ; if ( a b ) p = p1 ; p1 = p2 ; p2 = p ; printf(“a = %d, b = %dn”, a , b ) ; printf(“max = %d, min = %dn”, *p1 , *p2 ) ; 进行地址交换进行地址交换 本程序是采用交换变量本程序是采用交换变量 a 和和 b 的的地址地址来实现两个数的比较的,且比较来实现两个数的比较的,且比较前后前后 a , b 的的值并未发生变化值并未发生变化。&a&b59&b&a9

15、5p1p2p pp1p2aba b交换前交换前交换后交换后如输入如输入: 5 , 9 则输出则输出: a = 5 , b = 9 max = 9 , min = 5语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章三、三、 指针变量作为函数的参数指针变量作为函数的参数 函数调用时,把实参的值传递给形参。函数调用时,把实参的值传递给形参。 指针变量可以作指针变量可以作实际参数实际参数,其作用也是将实际,其作用也是将实际参数的值传递给形式参数,但此时的值代表是一个参数的值传递给形式参数,但此时的值代表是一个变量的变量的地址,地址,把把地址地

16、址传送给被调函数的形式参数。传送给被调函数的形式参数。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章例例 9.3设计一个函数,设计一个函数,交换两个数交换两个数。swap ( int *p1 , int *p2 ) int p ; main ( ) int a, b, *pointer_1, *pointer_2; scanf(“%d,%d”,&a,&b); pointer_1 = &a ; pointer_2 = &b ; if (a b) swap(pointer_1,pointer_2); printf(“n%d,%dn”,

17、a, b);单步运行单步运行运行结果运行结果注意注意通过指针运算,间接交换主调通过指针运算,间接交换主调函数中的函数中的 a 和和 b 的值,而的值,而 p1和和 p2 的值不变。的值不变。 若输入若输入: 5 , 9 输出为输出为: 9 , 5&a&b59abpointer_1pointer_2&a&a&a&b59abp1p2&a&a&b&b95p1pointer_1p2pointer_2ab&a&b95abpointer_1pointer_2语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 如果把如果把 swap 函数改成函数改成

18、 : swap (int *p1 , int *p2 ) int *p ; *p = *p1 ; *p1 = *p2 ; *p2 = *p ; 此句有此句有问题问题! 典型错误一典型错误一语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 swap(int x , int y ) int t ; t=x; x=y; y=t ; 55995995abxya bxy(a) (b) main ( ) int a , b ; scanf (“ %d , %d ” , &a , &b ) ; if ( a b ) swap ( a , b ) ;

19、 printf ( “ n %d , %d n ”, a , b ) ; 典型错误二典型错误二语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章实例实例实例实例说明说明:1. 如想通过函数调用得到如想通过函数调用得到 n 个要改变的值。个要改变的值。 在主调函数中设在主调函数中设 n 个变量,并用个变量,并用 n 个指针变量个指针变量指向它们。指向它们。 将指针变量作将指针变量作实参实参,使,使 n 个变量的个变量的地址地址传给所传给所调用的函数调用的函数形参形参。 通过形参指针变量,改变该通过形参指针变量,改变该 n 个变量的个变量的

20、值值。 主调函数中就可以使用这些改变了值的变量。主调函数中就可以使用这些改变了值的变量。2. 形参指针变量形参指针变量自自身值身值的变化不会的变化不会使使实参指针变实参指针变量的值量的值发生发生改变。改变。3. 可以通过改变形参指针变量所可以通过改变形参指针变量所指向指向的变量的值的变量的值来改变实参指针变量所来改变实参指针变量所指向指向的变量的值。的变量的值。 p1q1q1void point ( int *q1 ) q1 + = 2 ; main( ) int *p1, a = 4 ; p1= &a; point (p1) ; printf (“%d n”, *p1) ;&a&a函数调用时

21、函数调用时&a+2在被调函数中在被调函数中4 a&a p1&aq1void point ( int *q1 ) *q1 + = 2 ; main( ) int *p1 , a = 4 ; p1= &a ; point ( p1 ) ; printf ( “ %d n” , *p1 ) ; 6 a&a p1&aq1语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 swap (int *p1 , int *p2 ) int *p ; p = p1 ; p1 = p2 ; p2 = p ; main ( ) int a , b , *poi

22、nter_1 , *pointer_2 ; scanf ( “ %d , %d ” , &a , &b ) ; pointer_1 = &a ; pointer_2 = &b ; if ( a b ) swap ( pointer_1 , pointer_2 ) ; printf ( “ n %d , %d n ”, a , b ) ; 本函数中试图通过改变本函数中试图通过改变形参指针变形参指针变量量的值来使的值来使实参指针变量实参指针变量的值改变的值改变 典型错误三典型错误三错错误误原原因因a&a&b59bpointer_1pointer_2&a&b59abp1p2&b&a59abp1p2&

23、a&b59abpointer_1pointer_2语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章例例 9.4 swap ( int *pt1, int *pt2 );exchange ( int *q1 , int *q2 , int *q3 );main ( ) int a , b , c , *p1 , *p2 , *p3 ; scanf ( “ %d , %d , %d ”, &a, &b, &c) ; p1 = &a ; p2 = &b ; p3 = &c ; exchange(p1, p2, p3) ; printf(“n

24、%d,%d,%dn”, a, b, c) ; exchange ( int *q1 , int *q2 , int *q3 ) if (*q1 *q2) swap ( q1 , q2 ) ; if (*q1 *q3) swap ( q1 , q3 ) ; if (*q2 *q3) swap ( q2 , q3 ) ; 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章swap ( int *pt1, int *pt2 ) int p ; p = *pt1 ; *pt1 = *pt2 ; *pt2 = p ; 9010p1 a b cp2

25、 p3 9010q1 b cq2 q3 a exchange90pt1 bpt2 a swapp1q1 p1运行如下运行如下: 9, 0,10 10,9,0运行运行语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 数组的指针数组的指针: 数组的数组的起始地址起始地址( 首地址首地址 ) 数组元素的指针数组元素的指针: 数组元素的地址数组元素的地址9.3 9.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 C 语言中,指针变量可以指向变量,也可语言中,指针变量可以指向变量,也可以指向以指向数组数组和和数组元素数组元素。

26、语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 一、指向一维数组的指针变量的定义与赋值一、指向一维数组的指针变量的定义与赋值 指向数组的指针变量的定义同指向变量的指指向数组的指针变量的定义同指向变量的指 针变量的定义相同。针变量的定义相同。 例如例如: int a10 ; int *p ; 如果如果: p=&a0; 则则 p 指向了指向了a 数组的数组的第第 0号号元素。元素。 因为因为数组名数组名代表数组的首地址代表数组的首地址(即即起始地址起始地址),所以,所以 p = &a0 ; 等价于等价于 p = a ; 也可也可: in

27、t a10; int *p=&a0; 等价于等价于 int *p=a; 注意:注意:int *p = &a0 ; 的含义是将数组的的含义是将数组的首地址首地址 赋给指针变量赋给指针变量 p ,而不是赋给,而不是赋给 ( *p ) 。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 二、通过指针引用数组元素二、通过指针引用数组元素 如如: int a10, *p; p = a ;&a0 1 320 a0a1a9p&a1p+1说明说明: 1. 数组元素在内存中是连续存放的。数组元素在内存中是连续存放的。 2. (p+i) 表示指向表示指向

28、 ai 的地址,的地址,a+i 也表示也表示 ai 的地的地 址,故址,故 (p+i) 等价于等价于 a+i。 3. 指向数组的指针变量可以带下标。如指向数组的指针变量可以带下标。如: pi。a C 语言规定,指针变量语言规定,指针变量 p+1 指向下一个元素。指向下一个元素。 若数组元素为实型,则若数组元素为实型,则 p+1 表示的实际地址为:表示的实际地址为: p+1 d=p+1 4 ( d 为一个数组元素所占的字节数为一个数组元素所占的字节数)a+1&aip+ia+i&a9p+9a+9ai*(p+i)*(p+1)*p*(p+9)*(a+i)*(a+1)*a*(a+9) p0p1p9pi补

29、充补充语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章数组元素的引用数组元素的引用例例9.5 用三种方法输出数组各元素。用三种方法输出数组各元素。(1) 下标法下标法: 数组名数组名下标下标 或或 指针变量名指针变量名下标下标 例一例一 例二例二(2) 用数组名计算元素地址用数组名计算元素地址 设:设:int a10, *p=a; 则:则:*(p+i) 或或 *(a+i)表示元素表示元素 举例举例(3) 用指针变量指向数组元素用指针变量指向数组元素 举例举例下标法下标法(指针变量名(指针变量名下标下标) main ( ) int a1

30、0 , *p, i ; for ( i = 0 ; i 10 ; i+ ) scanf ( “ %d ”, &ai ) ; printf ( “ n” ) ; for ( p=a, i=0; i 10; i+ ) printf ( “%d ”, pi ) ; 用数组名计算元素地址用数组名计算元素地址 main ( ) int a10 , i ; for ( i = 0; i 10; i+ ) scanf (“%d”, &ai); printf(“n” ) ; for ( i = 0; i 10; i+ ) printf(“%d”, *(a+i ) ) ; 用指针变量指向数组元素用指针变量指向数

31、组元素 main ( ) int a10 , i , *p ; for ( i = 0 ; i 10 ; i+ ) scanf ( “ %d ”, &ai ) ; printf ( “ n” ) ; for ( p=a; p(a+10); p+) printf (“%d”, *p ); 下标法下标法(数组名(数组名下标下标) main ( ) int a10 , i ; for ( i = 0 ; i 10 ; i+ ) scanf ( “ %d ”, &ai ) ; printf ( “ n” ) ; for ( i = 0 ; i 10 ; i+ ) printf ( “%d ”, ai

32、) ; 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章注意注意: (1) 指针变量可以作自增,自减运算。指针变量可以作自增,自减运算。如如: +p, p 但数组名是常量不能作自增、自减运算。但数组名是常量不能作自增、自减运算。 如如: a+, a 等均不合法。等均不合法。 (2) 注意指针变量的当前值。注意指针变量的当前值。 错例错例 正例正例 (3) 注意指针变量的运算注意指针变量的运算 如如: int a10 , i , *p ; p = a ; 则则: p+ (或或 p += 1 )表示表示 p 指向指向 a1 , 此时若执行

33、此时若执行 *p 则取出则取出 a1 元素的值。元素的值。 “*” 与与 “+” 同优先级,自右往左结合。同优先级,自右往左结合。例如例如 (*p)+ 表示目标变量值加表示目标变量值加 1,指针变量值不变。,指针变量值不变。 *(p+) 等价于等价于 ai+ *(+p) 等价于等价于 a+i 即:即:p先先自增自增,再作再作*运算。运算。 while 循环实现的循环实现的实例实例1 实例实例2 main ( ) int a10 , i , *p; p = a ; for ( i = 0 ; i 10 ; i+ ) scanf ( “ %d ”, p+ ) ; printf ( “ n” ) ;

34、 for ( i = 0 ; i 10 ; i+ , p+ ) printf ( “%d ”, *p ) ; 错例错例main ( ) int a10 , i , *p; p = a ; for ( i = 0 ; i 10 ; i+ ) scanf ( “ %d ”, p+ ) ; printf ( “ n” ) ; for (i = 0, p=a; i 10 ; i+, p+) /* 或或 for(p=a; pa+0;p+) */ printf ( “%d ”, *p ) ; 正例正例main ( ) int a100 , *p ; p = a ; while ( p a +100 ) p

35、rintf(“%d”, *p+) ; main ( ) int a100 , *p ; p = a ; while ( p a +100 ) printf(“%d”,*p) ; p+ ; *p+ 等效于等效于 *(p+) , 即先取即先取 p 所所 指向变量的值,再使指向变量的值,再使 p + 1。 即:即:*p+先取先取 *p的值,后使的值,后使p+1; *(p+) 与与*(+p) 的作用不同。的作用不同。 *(+p) 先使先使 p+1,再取,再取 *p 的值的值 。实例实例语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章main

36、( ) int array10 ; f ( array, 10 ) ; arrayarr三、数组名作函数参数三、数组名作函数参数 对数组名作函数参数时,实际上是将实参数组对数组名作函数参数时,实际上是将实参数组的的首地址首地址传给形参,实参数组与形参数组共传给形参,实参数组与形参数组共占同一占同一段内存段内存。在调用函数过程中,形参数组中元素值发。在调用函数过程中,形参数组中元素值发生变化也就使实参数组的元素值随之而发生变化。生变化也就使实参数组的元素值随之而发生变化。f (int arr , int n) 动画演示动画演示语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计

37、计第第第第第第九九九九九九章章章章章章例例 9.7 将数组将数组 a 中中 n 个整数按个整数按相反顺序相反顺序存放。存放。算法:算法:将将第一个第一个元素和元素和最后一个最后一个元素对换,将第二个元素对换,将第二个同倒数第二个对换同倒数第二个对换. .即两两对换,直到即两两对换,直到: a(n1)/2 与与 an(n1)/21 对换为止。对换为止。 3 7 9 11 0 6 7 5 4 2 2 4 5 7 6 0 11 9 7 3imjvoid inv (int x , int n) int t, i, j, m =(n1)/2 ; for (i = 0; i = m; i+) j = n

38、1 i ; t = xi ; xi = xj ; xj = t ; return; /* 可去掉可去掉 */ 数组颠倒函数数组颠倒函数语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章main ( ) static int i,a10=3, 7,9, 11, 0, 6, 7, 5, 4, 2 ; printf ( “ The original array: n ” ) ; for ( i = 0 ; i 10 ; i + + ) printf ( “ %d , ”, ai ) ; printf ( “ n ” ) ; inv ( a ,

39、 10 ) ; printf(“The array has been inverted: n ”); for ( i = 0 ; i 10; i+ ) printf(“%d , ”, ai ) ; printf ( “ n ” ) ;运行结果:运行结果: The original array: 3 , 7 , 9 , 11 , 0 , 6 , 7 , 5 , 4 , 2, The array has been inverted: 2 , 4 , 5 , 7 , 6 , 0 , 11 , 9 , 7 , 3,运行结果运行结果语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计

40、第第第第第第九九九九九九章章章章章章 以上程序也可以改为如下以上程序也可以改为如下:void inv ( int *x , int n ) int *p, t, *i, *j, m; m = (n 1)/2 ; i = x ; j = x + n 1 ; p = x + m ; for ( ; i = p ; i+, j ) t = *i ; *i = *j ; *j = t ; return ; a 数组数组 a0 a1 . a9 3 3 7 70 0 i , x p = x+m j 2 2 4 4 5 5 7 7 6 6 11 11 9 9语语语语语语言言言言言言程程程程程程序序序序序序设

41、设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (1) 二者都用数组名二者都用数组名 main ( ) f ( int x , int n ) int a10 ; f ( a , 10 ) ; 特点特点: a 和和 x 数组共用同一段内存单元。数组共用同一段内存单元。 综上所述综上所述: 对于实参数组想在被调函数中改变此数组元素对于实参数组想在被调函数中改变此数组元素的值,的值,实参实参与与形参形参的对应关系可以如下的对应关系可以如下:语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (2) 实参为数组名,形参用指针变量实

42、参为数组名,形参用指针变量 main ( ) f ( int *x , int n ) int a10 ; f ( a , 10 ) ; 特点特点: 实参将数组的首地址传给形参指针变量,通过实参将数组的首地址传给形参指针变量,通过指针变量指向指针变量指向实参实参数组,进而对其作相应的处理。数组,进而对其作相应的处理。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (3) 二者都用指针变量二者都用指针变量 main ( ) f ( int *x , int n ) int a10 , *p ; p = a ; f ( p , 10 )

43、 ; 特点特点: :先使先使 p 指向指向 a 数组,再将数组,再将 p 传给传给 x , 使使 x 也指向也指向 a 数组,从而进行处理。数组,从而进行处理。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 (4) 实参为指针变量,而形参为数组名实参为指针变量,而形参为数组名 main ( ) f ( int x , int n ) int a10 , *p ; p = a ; f ( p , 10 ) ; 特点特点: 利用指针变量将利用指针变量将 a 数组的首地址传给数组的首地址传给 x 数组。数组。 使两数组共用同一段内存单元。

44、利用使两数组共用同一段内存单元。利用xi值的值的 变化,变化, 使使ai的值也发生变化。的值也发生变化。注意注意: 上述四种处理方式中,当用指针变量作实参上述四种处理方式中,当用指针变量作实参 时,时, 必须先使指针变量有确定的值,即指向必须先使指针变量有确定的值,即指向 一个已定义的数组一个已定义的数组。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 四四、二维数组的指针和指向二维数组的指针变量二维数组的指针和指向二维数组的指针变量 1. 二维数组和数组元素的地址二维数组和数组元素的地址 C 语言中语言中二维数组二维数组实际上是由

45、实际上是由若干个若干个按行存放的按行存放的一维数组一维数组构成的。如:构成的。如: int a34 ; a0 a00 a01 a02 a03 a1 a10 a11 a12 a13 a2 a20 a21 a22 a23 a 代表首元素的地址,此时首元素代表首元素的地址,此时首元素a0又是一个包又是一个包含有含有4个元素的一维数组。所以个元素的一维数组。所以 a (或或 a + 0 )表示二维表示二维数数组组第第0 行的地址行的地址。a+1,a+2 分别表示二维数组第分别表示二维数组第 1 行行和第和第 2 行的地址。所以行的地址。所以二维数组名二维数组名是一个是一个行指针行指针。 a语语语语语语

46、言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 a0, a1, a2分别表示一维数组名,所以分别表示一维数组名,所以a0代表代表 一维数组一维数组a0中第中第 0 列元素的地址即列元素的地址即 &a00。 同理同理: a1等价于等价于&a10, a2等价于等价于&a20。二维数组元素的二维数组元素的地址地址可表示为:可表示为: (1) &aij (2) ai + j (3) * (a + i ) + j ( 因为因为 ai 等价于等价于 * (a + i ) )二维数组元素的二维数组元素的引用引用可表示为:可表示为: (1) aij (2) *

47、 ( ai + j ) (3) * (* (a + i ) + j ) 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 1 3 5 7 2 4 6 81112 13 14p p +12. 指向二维数组的指针变量指向二维数组的指针变量 (1) 指向二维数组的指向二维数组的列指针列指针变量变量 int a34 , *p ; p=a0; ( 或或: p = &a00 ; 或或: p=*(a+0); 或或: p = *a ; )可见可见: p 是一个指向二维数组是一个指向二维数组 a 第第 0 行第行第 0 列元素列元素 的指针变量的指针变

48、量 ( 即即 p 是一个是一个列指针列指针变量变量 ) 。 同理同理: p+1 指向第指向第 0 行第行第 1 列元素。列元素。 说明:说明:p = a0 ; 不能写成不能写成 p = a ; 原因原因: a0 是一个列地址,是一个列地址, a 是一个行地址。是一个行地址。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 #include “stdio.h” void main ( ) int a34=1, 2, 3, 4, 9, 8, 7, 6, 10, 11, 5, 2 ; int *p = a0; for ( ; p a0 +1

49、2 ; p+ ) if ( p a0 ) %4 = = 0 ) printf( “n”) ; printf( “%4d” , *p ) ; 列指针变量举例列指针变量举例int *p = &a00 ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章所以所以 定义格式:定义格式: 数据类型数据类型 (* 标识符标识符 )常量常量 如:如: int ( *p)4 ; 表示表示: p 所指的对象是有所指的对象是有 4 个整型元素的数组。个整型元素的数组。 int a34 , ( *p)4 ; 如果如果: p=a; 则则 p 是指向是指向 a

50、数组第数组第 0 行的指针变量,行的指针变量, 即即: p 是一个是一个行指针变量行指针变量。 p+1 指向指向 a 数组第数组第 1 行,行, p+i 指向指向 a 数组第数组第 i 行。行。 1 3 5 7 2 4 6 811 12 13 14pp+1 *(p+i)+j 表示表示 a 数组中第数组中第 i 行行 j 列元素的列元素的地址地址。 *(*(p+i)+j)表示表示 a 数组中第数组中第 i 行行 j 列元素的列元素的值值,注意不能写成注意不能写成 p = a0 。(2) 指向二维数组的行指针变量指向二维数组的行指针变量 由于二维数组是由按行存放的一维数组构成,由于二维数组是由按行

51、存放的一维数组构成, C语言中可以用语言中可以用行指针行指针变量来引用二维数组元素。变量来引用二维数组元素。 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 行指针变量举行指针变量举例:例: 输出二维数组任意行任意列元素的值。输出二维数组任意行任意列元素的值。 void main ( ) int a34= 1, 2, 3, 4, 9, 8, 7, 6, 10, 11, 5, 2 ; int ( *p)4 , i , j ; p = a ; scnaf( “ %d ,%d ” , &i , &j ) ; printf(“a%d,%d=

52、%dn ”, i , j, *(*( p+i)+j ) ); *(*( a+i )+j ) ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 3. 补充实例补充实例 用函数调用方式编写程序找出二维数组用函数调用方式编写程序找出二维数组 a 中中每每行行的最小值并输出。的最小值并输出。要求:要求: 二维数组元素的值用随机函数产生二维数组元素的值用随机函数产生( 0 50)之间之间; 每行中元素的最小值在每行中元素的最小值在 line_min( ) 函数中求出函数中求出; 在主函数中输出每行的最小值。在主函数中输出每行的最小值。语语语语

53、语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 void main( ) 1、 定义一个二维数组定义一个二维数组 2、 调调随机函数随机函数对二维数组元素对二维数组元素赋值赋值 3、 调用调用 line_min 函数函数 4、 输出结果到屏幕输出结果到屏幕 line_min ( ) 1、 接收实参接收实参 2、求二维数组每行中的最小值求二维数组每行中的最小值 语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 方法一、用列指针来求解方法一、用列指针来求解 #include “stdl

54、ib.h” #define N 3 #define M 4 void main ( ) int aNM , min , i , j ; for( i = 0 ; i N ; i+) for( j = 0 ; j M ; j+) aij= random( 50 ) ; printf(“%4d”, aij ) ; if( j+1)%4 = = 0 ) printf(“n” ) ; for( i = 0 ; i N ; i+) min = line_min( ai ) ; printf(“a%d: min = %d n”, i, min ) ; line_min函数函数line_min ( int

55、* p ) int j , min ; min= *(p + 0) ; for( j = 1 ; j *( p + j ) ) min = * ( p + j ) ; return min ;语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章 #include “stdlib.h” #define N 3 #define M 4 void main ( ) int aNM , min , i , j ; for (i = 0; i N; i+) for (j = 0; j M; j+) aij= random(50); printf(“

56、%4d”, aij); if( j+1)%4 = = 0 ) printf(“n”); for( i = 0 ; i N ; i+) min = line_min( a + i ) ; printf(“a%d: min=%d n”, i, min); 方法二、用行指针求解方法二、用行指针求解 line_min ( int (* p)M ) int j , min ; min= * (*p) ; for( j = 1 ; j * (*p + j ) min = * (*p + j) ; return min ; line_min函数函数 说明:说明: random(x) 函数产生一个函数产生一个

57、 ( 0 x1) 间间的的随机整数随机整数, 相关的函数有:相关的函数有: rand( )函数产生函数产生 0 32767间的随机数。间的随机数。 如:如: rand( )%100 可产生可产生0 99 的整数。的整数。 (rand( )%90 + 10.0 ) / 10.0 可产生可产生 1.0 10.0 之间的实数。之间的实数。 说明说明语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章419.4 字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量 字符串的指针就是字符串的指针就是字符串的首地址。字符串的首地址。

58、一、一、 字符串的表示形式字符串的表示形式 1、 用字符数组实现用字符数组实现 例例 9.16 main ( ) char string = “I Love China”; printf (“%sn”, string ) ; 其中其中 string 是数组名,表示字符数组的是数组名,表示字符数组的首地址。首地址。 stringi 表示数组中的一个元素。如表示数组中的一个元素。如: string4 代表代表第第 5 个元素,即个元素,即 字母字母 v 。语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章422、用字符指针实现、用字符指针实

59、现例例 9.17 main ( ) char *string = “I Love China”; printf ( “ %sn ” , string ) ; 注意注意: C 语言中对语言中对字符串可以进行整体输入和输出字符串可以进行整体输入和输出。 而对而对数值型数组则不能用数组名来输出数值型数组则不能用数组名来输出它的全它的全 部部元素,元素,只能逐个元素输出只能逐个元素输出。 含义及说明含义及说明char *string ;string = “ I Love China ” ; 含义及说明含义及说明将字符串的将字符串的首地址首地址赋给指针变量赋给指针变量 string 。说明:说明:尽管没

60、有直接定义字符型数组,但实尽管没有直接定义字符型数组,但实际上际上 C 语言对字符串常量均按字符数组来语言对字符串常量均按字符数组来处理。即在内存中开辟了一个字符数组用处理。即在内存中开辟了一个字符数组用来存放字符串常量。来存放字符串常量。注意注意语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章43例例 9.18 将字符串将字符串 a 复制到字符串复制到字符串 b 。main ( ) char a = “I am a boy .”, b20 ; for ( i = 0; *(a+i)!=0; i+) *(b+i)=*(a+i); *(

61、 b + i ) = 0 ; printf(“string a is: %s n ”, a ) ; printf(“string b is : ” ) ; for ( i = 0 ; bi ! = 0 ; i+) printf ( “ %c ”, bi ) ; printf ( “ n ” ) ; 3. 对字符串的处理对字符串的处理可以用下标法可以用下标法,也可用,也可用指针法指针法。运行结果运行结果: string a is: I am a boy . string b is: I am a boy . 运行结果运行结果语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计

62、第第第第第第九九九九九九章章章章章章44例例 9.19 用指针变量来处理。用指针变量来处理。main ( ) char a =“I am a boy”, b20; char *p1, *p2; int i ; p1 = a ; p2 = b ; for ( ;*p1 != 0; p1+,p2+) *p2 = *p1 ;*p2 = 0 ; printf(“string a is: %sn ”, a );printf ( “ string b is : ” ) ;for ( i = 0 ; bi ! = 0 ; i+) printf ( “ %c ”, bi ) ;printf ( “ n ” )

63、 ; Iamaboy .0ap1p1bp2p2I0语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章45(1) 用字符数组作函数参数用字符数组作函数参数实现字符串复制。实现字符串复制。 void copy_string (char from , char to ) int i = 0 ; while ( from i != 0 ) toi = from i ; i + + ; toi = 0 ; main ( ) char a = “ I am a teacher .” ; char b = “ you are a student .”

64、 ; printf(“string_a=%sn string_b=%sn”,a,b) ; copy_string ( a , b ) ; printf ( “ n str_a = %sn str_b = %sn ”, a,b ) ; 二、字符串指针作函数参数二、字符串指针作函数参数运行结果运行结果运行结果运行结果: string_a = I am a teacher . string_b = you are a student . string_a = I am a teacher . string_b = I am a teacher .语语语语语语言言言言言言程程程程程程序序序序序序设设设

65、设设设计计计计计计第第第第第第九九九九九九章章章章章章46main ( ) char *a = “ I am a teacher .” ; char *b = “ you are a student .”; printf(“str_a=%sn str_b=%sn”, a, b); copy_string ( a , b ) ; printf(“n str_a=%sn str_b=%sn ”, a, b);(2) 主调函数主调函数: main 函数中函数中改改用字符型指针变量用字符型指针变量 void copy_string(char from , char to ) int i = 0 ; w

66、hile ( from i ! = 0 ) toi = from i; i+; toi = 0 ; 二、字符串指针作函数参数二、字符串指针作函数参数语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计第第第第第第九九九九九九章章章章章章47 (3) 形参用字符指针变量形参用字符指针变量 void copy_string ( char *from , char *to ) while( *from ! = 0 ) *to = *from ; to+ ; from+ ; *to = 0 ; main ( ) char *a = “ I am a teacher .” ; char *b = “ you are a student .” ; printf(“str_a = %sn str_b = %sn”, a , b ) ; copy_string ( a , b ) ; printf(“n str_a=%sn str_b=%sn”, a , b ); 二、字符串指针作函数参数二、字符串指针作函数参数语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!