第四章简单构造数据类型.ppt

上传人:本田雅阁 文档编号:3459145 上传时间:2019-08-28 格式:PPT 页数:70 大小:589.04KB
返回 下载 相关 举报
第四章简单构造数据类型.ppt_第1页
第1页 / 共70页
第四章简单构造数据类型.ppt_第2页
第2页 / 共70页
第四章简单构造数据类型.ppt_第3页
第3页 / 共70页
第四章简单构造数据类型.ppt_第4页
第4页 / 共70页
第四章简单构造数据类型.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

《第四章简单构造数据类型.ppt》由会员分享,可在线阅读,更多相关《第四章简单构造数据类型.ppt(70页珍藏版)》请在三一文库上搜索。

1、2019/8/28,C语言程序设计,1,第四章 简单构造数据类型,前面的章节中我们已经学习了C语言中的一些基本数据类型(整型、字符型、实型),从本章开始我们学习构造类型的数据:数组类型、结构体类型、共同体类型,枚举类型。,4.1 一维数组 4.2 二维数组 4.3 字符数组与字符串 4.4 数组与指针 4.5 字符串与指针 4.6 典型例题,2019/8/28,C语言程序设计,2,4.1一维数组 4.1.1 一维数组的引出,例4.1:编写一个函数,从键盘读如10个数,返回最大数,在主函数中输出最大数。,#include int max( ) float x,n,p; printf(“input

2、 10 numbers:n”); scanf(“%f”, ,void main( ) printf(“max=%dn”, max( ); ,2019/8/28,C语言程序设计,3,改进4.1_1:要求在主函数中读入10个数。,2019/8/28,C语言程序设计,4,上节回顾,(1)指针变量 (2)变量的指针 (3)int a=4, *s; s= 则,*s= ? (4)值传递方式 vs 地址传递方式,就是存放变量地址的变量。,就是变量的地址。,4,#include void swap(int *px,int *py) int temp; temp=*px; *px=*py; *py=temp;

3、void main() int x=7,y=11,*p1,*p2; p1= ,2019/8/28,C语言程序设计,5,上节回顾,1、数组: 2、数组定义: 3、数组的引用: 4、数组的初始化: 5、冒泡排序:,是指一个有序数据的集合,其中每个元素由统一的数组名和下标来唯一的表示。,定义形式: 类型说明符 数组名常量表达式,引用形式:数组名下标,如: int a5 = 1 , 3 , 5 , 7 , 9 ;,2019/8/28,C语言程序设计,6,1、所谓的数组是指一个有序数据的集合,其中每个元素由统一的数组名和下标来唯一的表示。,2、定义形式:类型说明符 数组名常量表达式 如:int a5;

4、表示一个含有5个整型元素的数组,其中a是数组名,元素是a0,a1,a2,a3,a4。,4.1.2一维数组的定义和引用,2019/8/28,C语言程序设计,7,【说明】: 、数组名由用户定义,定义规则和变量名相同, 、常量表达式表示数组的元素个数,即数组长度。常量表达式中可以包括常量和符号常量,不能包含变量。 、数组的下标从0开始。 、和其他变量一样,数组也必须先定义后使用。,2019/8/28,C语言程序设计,8,判断一下数组表达方式正误?,int a(10); 数组a10中包括元素: a0,a1,a9,a10 int n; scanf(“%d”,( ),(),(),(),2019/8/28,

5、C语言程序设计,9,3、一维数组的引用,引用形式:数组名下标,注意: 数组元素的下标可以是整型常量或整型表达式; C语言规定只能逐个引用数组元素而不能一次引用整个数组; 对下标的引用不要超过下标的最大值。,例: int x10,n; for(n=0;n10;n+) scanf(“%d”,4、 一维数组的初始化 (1)概念 : 在定义一维数组时对各元素指定初始值称为 数组的初始化,如: int a5 = 1 , 3 , 5 , 7 , 9 ;,(2)方法: 1)、在数组定义的同时对全体数组元素初始化。(可以省略数组长度) 如: int a=1,2,3,4,5; 2)、可以仅对一部分下标元素赋初值

6、。(不能省略数组长度 ) 如: int a5=1,2,3,则; a0= a1= a2= a3= a4=,1,2,0,0,3,2019/8/28,C语言程序设计,11,3)、如果不对某些下标元素赋初值,则对数值型元素均为0,对字符型元素均为空操作符0. 4)、如果想对所有的元素全部赋初值,可以省略定义元素个数。 如: int a=1,2,3,4,5; 5)、如果使数组所有元素值为0,可以: int a10=0,0,0,0,0,0,0,0,0,0; 或 int a10=0;,经典例题4.2: 用冒泡排序法对6个数进行排序(从小到大),a0 a1 a2 a3 a4 a5,2,7,7,5,4,7,1,

7、4,5,1,5,1,4,1,2,冒泡排序方法: 依次比较相邻的两个数,将小数放前面, 大数放后面. n个数排序需要进行n-1轮比较, 从第1轮到 第n-1轮, 各轮的比较次数依次为:n-1次、n-2次 1次,9,9,9,9,9,7,2,5,4,1,初始状态,第1轮,第2轮,第3轮,第4轮,第5轮,7,4.1.3一维数组程序举例,2019/8/28,C语言程序设计,13,#include void main( ) int a6 , i , j , t; for ( i=0 ; iaj+1 ) t=aj ; aj=aj+1 ; aj+1=t ; for ( i=0 ; i6 ; i+) print

8、f( “%3d”, ai ); ,输入6个数据,用嵌套的for循环实现排序 外层循环控制进行6-1轮比较 内层循环控制第i轮进行6-i次比较,若前面的数大于后面的数,则进行交换,输出排序后的6个数据,2019/8/28,C语言程序设计,14,a0 a1 a2 a3 a4 a5,第1轮,第2轮,第3轮,第4轮,第5轮,从这道例题中我们发现,在进行完第二轮比较后,实际上 排序已经完成了,从第三轮开始,后面的比较都是多余的, 在这种情况下我们希望可以终止比较.,初始状态,为了解决问题,我们在程序中 设置一个变量flag,用它记录 在一轮比较中是否进行了交换 在每轮比较开始前flag=0,如 果在此轮

9、比较中进行了交换, 则flag=1,在一轮比较结束后, 判断flag的值是否为1,如果值 为0,说明在此轮比较中没有进 行交换(即已经完成排序了), 此时可以终止循环(即结束排 序)如果flag的值为1,则要继 续进行排序,#include void main( ) int a6 , i , j , t , flag; for ( i=0; iaj+1 ) t=aj ; aj=aj+1 ; aj+1=t ; flag=1; i+ ; while ( flag ) ; for ( i=0 ; i6 ; i+) printf( “%3d”,ai ); ,2019/8/28,C语言程序设计,16,例

10、4.3 用数组处理Fibonacci数列问题,输出20以内的所有项的值。,#include void main( ) int f20=1,1; int i; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(“n“); /*if语句用来控制换行,每行输出5个数据。*/ printf(“%-12d“,fi); printf(“n“); ,2019/8/28,C语言程序设计,17,例4.4: 假设考试共有4个科目,一个班有3名学生。输入所有学生的各科成绩,求出每名学生的总成绩。,4.2、二维数组的定义和引用 4.2.1 二

11、维数组的引出,2019/8/28,C语言程序设计,18,1、 概念 : 一个一维数组, 它的每一个元素都是类型相同的一维数组, 就形成一个二维数组,2、 定义形式 : 类型标识符 数组名 常量表达式1 常量表达式2 如: int a34 ;,a0 a1 a2,4.2.2 二维数组的定义和使用,2019/8/28,C语言程序设计,19,3、 存储形式 : 数组的元素在内存中是连续存放的 例 int a33 ; 的存放形式如下 :,a10a11a12,a20a21a22,a00a01a02,a00 a01 a02 a10 a11 a12 a20 a21 a22,1010 1012 1014 101

12、6 1018 1020 1022 1024 1026,2019/8/28,C语言程序设计,20,4、二维数组元素的引用,二维数组元素的表示:数组名下标下标,2019/8/28,C语言程序设计,21,(1). 分行初始化 int a34= 1, 2, 3, 4 , 5, 6, 7, 8 , 9, 10, 11, 12 ; 此方法较直观, 第一对 内的数据赋给 第一行数组元素, 以此类推,(2). 按数据的排列顺序对数组元素赋初值 int a34= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 将数据依次赋给元素 a00 , a01 a23,注意: 此方法数据没有明显

13、的界限, 当数据较多时容易出错,5. 二维数组的初始化,2019/8/28,C语言程序设计,22,(3). 对数组的部分元素赋初值 int a34= 1,2 , 3 , 0,4 ;,int a34= 1,2,3,4,5,6 ;,(4). 对数组的全部元素赋初值时可以省略第一维的长度 系统会根据数据的个数和第二维的长度自动求出 第一维的长度 int a 4= 1, 2 , 0, 3, 4 , 5 ; int b 2= 1, 2, 3, 4, 5, 6, 7, 8 ;,数组a 第一维长度为 3,数组b 第一维长度为 4,4.2.3 二维数组程序举例,#include #define M 3 /*定

14、义符号常量M,代表学生总人数*/ #define N 4 /*定义符号常量N,代表5个考试科目*/ void main( ) float score205,sum20; int i,j; printf(“Input %d students %d scores(score%d%d):n“,M,N,M,N); for(i=0;iM;i+) sumi=0; /*第i个学生的总成绩初值0*/ for(j=0;jN;j+) printf(“input %dth student %dth score:“,i+1,j+1); scanf(“%f“, /*输出第i个学生的总成绩*/ ,例4.4,2019/8/

15、28,C语言程序设计,24,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(“array a:n“); for(i=0;i=1;i+) for(j=0;j=2;j+) printf(“%5d“,aij); bji=aij; printf(“n“); ,printf(“array b:n“); for(i=0;i=2;i+) for(j=0;j=1;j+) printf(“%5d“,bij); printf(“n“); ,2019/8/28,C语言程序设计,26,上节回顾,1、二维数组的定义 2、二维数组的引用 3、二维

16、数组的初始化,类型标识符 数组名 常量表达式1 常量表达式2 如: int a34 ;,数组名下标下标,(1). 分行初始化 (2). 按数据的排列顺序对数组元素赋初值,2019/8/28,C语言程序设计,27,4.3 字符数组 4.3.1 字符数组的引出,一、引入 思考:怎样表达 Tom,China,ISBN等?,二、定义 字符串:由若干有效字符组成的字符序列; 字符串必须以0作为结束标志,它只是表示一个字符串的结束,没有任何的具体含义。,C语言中的字符串是作为字符数组来处理的。,2019/8/28,C语言程序设计,28,4.3.2 字符数组的定义和引用,1. 字符数组定义 : 用来存放字符

17、型数据的数组称为字符数组。 例: char c10;,2. 字符数组的初始化 : (1)可以逐个字符元素赋值; 例:char 5=C,h,i,n,a ; (2)当初值个数小于字符数组长度时,其余元素自动赋值为0; 例:char10=B,e,i,J,i,n,g; 则:str7=str8=str9=0;,2019/8/28,C语言程序设计,29,(3) 当初值个数大于数组长度,按语法错误处理; (4) 当初值个数与预定的数组长度相同时,可以省略数组长度; 例:char c= =C,h,i,n,a ; (5)也可以定义和初始化一个二位字符数组。 例: char diamond33= ,*, ,*,

18、,*, ,*, ,* * * *,2019/8/28,C语言程序设计,30,3. 字符数组的引用 : 引用字符数组中的一个元素,可以得到一个字符。,例4.6:/*输出一个字符串*/ #include void main( ) static char c10= I, , a, m, , a, , s, t, u, d, e, n, t; int i; for(i=0;i10;i+) printf(“%c“,ci); printf(“n“); 运行结果为:I am a student,2019/8/28,C语言程序设计,31,1. 字符串的定义: 由若干个有效字符组成的序列 ,用双引号括起来。 有

19、效字符包括字母, 数字, 专用字符, 转义字符 如 : “bfer” “a45-7” “mtkn”,C语言中没有专门的字符串变量, 因此字符串存放在字符数组中, 字符串以“0”作为结束标志,说明: 定义字符数组时,要保证数组长度始终大于字符串实际长度。例:字符串“How are you”在内存中实际占12个字符。,4.3.3 字符串的定义和引用,2019/8/28,C语言程序设计,32,2、字符数组的初始化: 初始化形式: (1)数据类型 数组名=字符串;或 (2)数据类型 数组名=字符串; 如:char aa=”good morning!”; 则数组aa的长度为14而不是13。由系统在字符串

20、后加一个0。 以上字符串赋值相当于: char aa=“good morning!”; 或 char aa=g,o,o,d,m, o,r,n, i,n,g,!,0;,(1). 为数组中的元素指定初值 char c8 = H,e,l,l,o ;,如果对数组全部元素指定初值, 则可以省略数组的长度 char c = H , e , l , l , o ;,(2). 对字符数组指定字符串初值,char c8 = “Hello” ; char c8 = “Hello” ; char c8 = H,e,l,l,o,0 ;,char c = “Hello”;,char c6=“Hello”;,char c

21、5 = “Hello” ;,错误的初始化,注意 : 初始化时数组的长度应足够大, 确保可以容纳所有字符和结束标志0,3、 字符串的输入 (1). 输入单个字符 char c8 ; int i ; scanf(“%c%c%c” , ,for ( i=3 ; i8 ; i+ ) scanf(“%c” , ,(2). 输入一个字符串 scanf ( “%s” , c ) ; 说明 : 用格式字符 %s 输入字符串, 字符数组变量c不需要 加地址运算符& , 因数组名本身代表数组的首地址,注意 : (1) 从键盘输入字符串时不加“ ” (2) 用scanf 输入字符串时, 空格和回车符都会作为 字符串

22、的分隔符,即scanf不能用来输入包含有 空格的字符串,(3). 字符串输入函数 gets ( 字符数组 ) 如 : gets(c) ;,说明: 输入有空格的字符串时应使用函数gets , 它会读入全部字符直到遇到回车符为止,例: int i ; char c8; for ( i=0 ; i8 ; i+ ) scanf(“%c”,假设输入为: abcd efgh,注意: 用gets输入字符串时, 若输入字符数目大于字符数组的长度, 多出的字符则会存放在数组的合法存储空间之外,实际编程不建议这样做,多出字符较多时执行会出错。,2019/8/28,C语言程序设计,36,4、 字符串的输出 (1).

23、 输出单个字符,char c8 ; int i ; printf( “%c%c” , c0 , c1 ) ; for ( i=2 ; i8 ; i+ ) printf( “%c” , ci ) ;,(2). 输出字符串 printf( “%s” , c ) ;,注意: 输出时不包括字符0, 如果一个字符串中有多个0 则输出时遇到第一个0即认为字符串结束,(3). 字符串输出函数 puts ( 字符数组 ) 一次输出一个字符串, 输出时将0自动转换成换行符,例: char s15=“abc”, s210=“defg” ; printf( “%s%sn” , s1 , s2 ) ; puts( s

24、1 ) ; puts( s2 ) ;,输出结果: abcdefg abc defg,例: int i ; char c8; gets ( c ) ; for ( i=0 ; i8 ; i+ ) printf(“%c”, ci ); printf(“n”) puts ( c ); printf(“%s”, c );,假设输入为: abcd efgh,输出结果: abcd efg abcd efgh abcd efgh,2019/8/28,C语言程序设计,38,4、 字符串数组,字符串数组就是数组中的每一个元素是一个字符串。 实际上是一个二维字符数组。该二维字符数组的第一维表示字符串的个数,第二维

25、表示每个字符串的存储的长度。,例:char str510;,字符串处理函数 (使用字符串函数时要写#include ) (1). 字符串拷贝函数 注意: C语言不允许用赋值表达式对字符数组赋值 char s15=“abc” , s23 , s38 ; s2 = “abc” ; s3 = s1 ; ,/* 赋值与初始化不同 */,/* 对s2 , s3 的赋值都是非法的 */,希望字符数组s2或s3中也存放字符串“abc”不能用赋值 而要用字符串拷贝函数,格式 : strcpy( 字符数组变量1 , 字符串2 ) 作用 : 将字符串2中的字符复制到字符数组1中 说明 : 字符数组1 必须足够大

26、字符串可以是字符串常量, 也可以是字符数组变量 拷贝时0也一起拷贝,6、字符串处理函数,2019/8/28,C语言程序设计,40,例: char s15=“abc” , s23 , s38 ; strcpy ( s3 , s1 ) ; strcpy ( s2 , s1 ) ;,s1,s3,s2,函数strncpy( 字符数组1 , 字符串2 , n ) 作用: 将字符串2的前n个字符复制到字符数组1 中 例: char c110 , c2 =“abcdef” ; strncpy( c1 , c2 , 3 ) ;,c1,c2,a b c,(2). 字符串连接函数 a) 格式: strcat (

27、字符数组变量1 , 字符串2 ) b) 作用: 将字符串2中的字符连接到字符串1 的后面, 产生的 新字符串仍存放在字符数组1 中 c) 说明: 连接时将字符串1 末尾的0将去掉 , 而在连接后的 新字符串末尾添加0 注意: 字符数组1要足够大,例: char s110=“abc” , s2 =“def” ; strcat ( s1 , s2 ) ; strcat ( s1 , “gh” ) ;,s1,s2,d,e,f,0,g,h,0,2019/8/28,C语言程序设计,42,(3). 字符串比较函数 a) 格式 : strcmp ( 字符串1 , 字符串2 ) b) 作用 : 比较两个字符串

28、的大小 c) 说明 : 两个字符串可能是字符串常量或字符数组变量 两个字符串比较时, 从字符串中的第一个字符开始逐个 比较其ASCII码值, 直到出现不同字符或出现0为止 比较的结果由函数值带回,str1 = = str2 函数值为0 str1 str2 函数值为正数 str1 str2 函数值为负数,2019/8/28,C语言程序设计,43,(4). 测字符串长度函数 格式: strlen (字符串) 作用: 测出字符串中实际字符的个数( 不包括0 ),例 : int len1, len2 ; char s10 ; len1 = strlen( “computer”) ; gets(s) ;

29、 len2 = strlen(s) ;,(5). 字符串中大、小字母转换 strlwr ( 字符串 ) 将字符串中大写字母换成小写字母 strupr ( 字符串 ) 将字符串中小写字母换成大写字母,2019/8/28,C语言程序设计,44,例4.7:用循环求从键盘输入的字符个数。 #include #define MAX 80 main() char aMAX; int i=0; printf(“Input a string:“); scanf(“%s“,a); do i=i+1; while(ai!=0); printf(“%d“,i); ,本例在进行输入时,因为数组名本身就代表地址,故不使

30、用求地址运算符。因为在输入字符串时,自动加上一个结束符0,以此来判断字符串是否结 束。,4.3.4 字符串程序举例,教材例4.9, 4.10 自学,2019/8/28,C语言程序设计,45,上节回顾,1、字符串的输入/输出 2、(1)字符串拷贝函数 (2)字符串连接函数 (3)字符串比较函数 (4)求字符串长度 (5)全部转化为大(小)写,puts( 字符数组) gets(字符数组) %s,#include strcpy( 字符数组变量1 , 字符串2 ) strncpy( 字符数组1 , 字符串2 , n ),strcat ( 字符数组变量1 , 字符串2 ),strlen (字符串),st

31、rlwr ( 字符串 ) strlpr ( 字符串 ),strcmp ( 字符串1 , 字符串2 ),2019/8/28,C语言程序设计,46,4.4 数组与指针 4.4.1 一维数组与指针,一、指向数组元素的指针 与指向变量的指针用法相同。,二、指向数组的指针 就是将数组的首地址赋值给指针变量。,例: int a10; int *p; p=,数组名就代表数组的首地址,2019/8/28,C语言程序设计,47,指针变量加法: 指针和整数进行加减运算是按地址的运算规则进行的。 例 : p=p+n; p=p-n;,则, 指针变量p的值按以下公式计算: p的新值=p的旧值+/-n*sizeof(指针

32、基类型) 即,一个指针变量加或减n后,相当于把指针变量的指向向后或向前移动了n个基类型单元。,2019/8/28,C语言程序设计,48,三、通过指针引用数组元素 a中的第i+1个元素可以表示为: (1) ai; (2) *(p+i),2019/8/28,C语言程序设计,49,注意: 1、可以改变指针变量的值,但是指针常量不可以改变! p+合法,但是a+不合法(a是数组名,是指针常量) 2、要注意指针变量的当前值; 3、使用指针变量指向数组元素时,要保证指向有效元素; 4、注意指针变量的运算; p+ 是p指向下一个元素 *p+ 等价于*(p+) *(p+)和*(+p)不同 (*p)+ 是p指向的

33、元素加1,xi等价于 *(x+i) &xi等价于x+i,2019/8/28,C语言程序设计,50,例4.8: 一个数组含有10个学生的成绩,编写程序输出所有学生的成绩,以及最高分和最低分。,#include void main( ) int score10,*p= ,2019/8/28,C语言程序设计,51,4.4.2 多维数组与指针(自学),一、多维数组元素的地址 设一个数组定义为: int a34,其中,a表示数组的首地址,即&a00。,a+0,a+1,a+2,ai等价于*(a+i) , aij 等价于 *(*(a+i)+j),2019/8/28,C语言程序设计,52,二、指向多维数组元素

34、的指针变量 指向一个有m个元素组成的一维数组的指针变量的定义为: 类型名 (*指针变量名)长度,例: int (*pa)4; pa是指针变量, 他指向一个包含4个元素的一维数组。,注意:该定义与定义int *pa; 和 int *pa4; 不同。,思考:如果执行pa+,则pa实际怎家了多少?,2019/8/28,C语言程序设计,53,4.4.3 数组作为函数参数,一、数组元素作为函数参数 与一般变量作函数参数是一样的,是“值传递”。,二、数组名作函数参数 注意:数组名就是数组的首地址! 是“地址传递”。,2019/8/28,C语言程序设计,54,数组作函数参数总结,f(int z,int n)

35、 main() int a10; f(a,10); ,(1) (2) (3) (4),f(int z,int n) main() int a10,*p; p=a; f(p,10); ,f(int *x,int n) main() int a10; f(a,10); ,f(int *x,int n) main() int a10,*p; p=a; f(p,10); ,#include void paixu( int x10 ) int m,n,flag,t; for(m=0;mxn+1) t=xn; xn=xn+1; xn+1=t; flag=1; if (flag=0) break; void

36、 main() int a10,i; printf(“Input 10 integers:n”); for(i=0;i10;i+) scanf(“%d”, ,例如4.9_1:冒泡排序,#include void paixu(int x,int y) int m,n,flag,t; for(m=0;mxn+1) t=xn; xn=xn+1; xn+1=t; flag=1; if (flag=0) break; void main() int a10,i; printf(“Input 10 integers:n”); for(i=0;i10;i+) scanf(“%d”, ,例如4.9_2:冒泡排

37、序,#include void paixu(int *x,int y) int m,n,flag,t; for(m=0;m*(x+n+1) t=*(x+n); *(x+n)=*(x+n+1); *(x+n+1)=t; flag=1; if (flag=0) break; void main() int a10,i; printf(“Input 10 integers:n”); for(i=0;i10;i+) scanf(“%d”, ,例如4.9_3:冒泡排序,等价于: if(xnxn+1) t=xn;xn=xn+1;xn+1=t; flag=1;,2019/8/28,C语言程序设计,58,例如

38、4.10:将数组a中的n歌数按相反顺序存放,#include void inv(int x ,int n); void main( ) int a10=3,7,9,11,0,6,7,5,4,2; int i; printf(“the original array:n“); for(i=0;i10;i+) printf(“%d “,ai); inv(a,10); printf(“nthe array has been inverted:n“); for(i=0;i10;i+) printf(“%d “,ai); printf(“n“); ,2019/8/28,C语言程序设计,59,void in

39、v(int x ,int n) int temp,i,m; m=(n-1)/2; for(i=0;i=m;i+) temp=xi; xi=x9-i; x9-i=temp; ,数组作形参,指针作形参(一),void inv(int *x,int n) int i,m, temp; m=(n-1)/2; for(i=0;i=m;i+) temp=*(x+i); *(x+i)=*(x+9-i); *(x+9-i)=temp; ,2019/8/28,C语言程序设计,60,指针作形参(二),void inv(int *x,int n) int *p,*i,*j, temp, m=(n-1)/2; i=x

40、;j=x+n-1;p=x+m; for(;i=p;i+,j-) temp=*i; *i=*j; *j=temp; ,2019/8/28,C语言程序设计,61,三、多维数组作函数参数(自学),多维数组名也是数组的首地址,因此也是“地址传递”。,例如:求4*5矩阵中最小元素及其行号和列号。 int min(int a45,int *r,int *c) int mina,m,n; mina=a00; for(m=0;mamn) mina=amn;*r=m;*c=n; return(mina); ,main() int x45,p,q,minx,row,colum,; for(p=0;p4;p+) f

41、or(q=0;q5;q+) scanf(“%d”, ,2019/8/28,C语言程序设计,62,例1:用字符指针指向一个字符串 char *s=“I love China!”; printf(“%sn”,s);,4.5字符串与指针,字符串指针一般形式:char *字符串指针变量名,I love China!0,S,比较:用字符数组存放字符串 char s =“I love China!”; printf(“%sn”,s);,I love China!0,S0,S13,2019/8/28,C语言程序设计,63,(2)指针法: #include void main() char a=“Hello,

42、World!”, b20; char *pa=a;*pb=b; for(;*pa!=0;pa+,pb+) *pb=*pa; *pb=0; puts(b); ,例2:用字符串指针访问字符串,(1)下标法 #include void main() char a=“Hello,World!”,b20; int i; for(i=0;ai!=0;i+) bi=ai; bi=0; puts(b); ,2019/8/28,C语言程序设计,64,字符指针和字符数组的区别,1、 字符数组由若干个元素组成,每个元素中存放着一个字符;而字符指针变量中存放的是地址,不是将字符串放到字符指针变量中。,2、 赋值方式:

43、 (1)对于字符数组只能对各个元素赋值。 char str20; str20=“I love China!“;(是错误的) (2)而对于字符指针可进行整体赋值: char *ps; ps=“I love China!“;,2019/8/28,C语言程序设计,65,3、对字符指针变量赋初值: (1)char *s=“I love China!“; 等价于: char *s; s=“I love China!“; (2)char str =“I love China!“; 等价于: char str14; strcpy(str, “I love China!“);,字符指针和字符数组的区别(续),

44、2019/8/28,C语言程序设计,66,字符指针和字符数组的区别(续),4、如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址,也就是说,该指针变量指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据。例如: char str10; scanf(“%s”,str); 以下的定义与输入是错误的: char *a; scanf(“%s”,a);,char *a ,str10; a=str; scanf(“%s”,a);,2019/8/28,C语言程序设计,67,字符指针和字符数组的区别(续),5、指针变量的值是可以改变的。 #include void main( ) char *a=“I love china!“; a=a+7; printf(“%s”,a); ,输出:china!,2019/8/28,C语言程序设计,68,例4.10:用函数调用实现字符串的复制 (1)字符数组作函数参数 #include void copy_str(char to,char from) int m=0; while(fromm!=0) tom=fromm; m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1