1、第九章函数知识要点:一维说组的定义:1)当数组中每个元素只带一个下标时,称这样的数组为一维数组。2)定义一维数组的一般形式为: 类型名 数组名 常量表达式.例如:int a8;说明如下:(1)定义一个名为a的一维数组。(2)方括号中8规定a数组中有8个元素(a0到a7)(3)类型名int 规定a数组中每个元素为整型,且每个元素中只能存放整型数。(4)每个元素只有下标且第一个元素的下标总为0(5)C语言编译程序为a数组开辟8个连续的存储单元。a0 a1 a2 a3 a4 a5 a6 a73) (1): 在定义数组语句中,可以有多个数组说明符,他们用逗号隔开。 例如:double a22,b100
2、, c5; (2):数组说明符和普通变量名,可以同时出现在一个类型的定义语句中。.一维数组的引用)引用形式如下:数组名下标表达式例如:double a8;则a0,aj,ai+k都是合法的。注意:ai+k中i+k是下标表达式不是两个下标.():一个数组元素实际上就是一个变量名。代表内存中的一个存储单元。():一个数组不能整体引用,数组名中存放的是一个地址常量,它代表整个数组的首地址。()在引用数组元素时,数组元素下标表达式必须是整数,下标表达式下限为。系统并不会自动检验数组元素下标是否越界,因此编程时候要多注意。.一维数组的初始化。)在定义语句中给所定义数组赋初值初值放在赋值号后的花括号中,数值
3、类型与说明类型一致,初值间用逗号隔开,系统将自动按顺序从a0开始依次给a数组中元素。如int a8=0,1,2,3,4,5,6,7;2)(1)当初值少于元素个数时,后面元素赋给。字符补给0例如:int a10=0;十个元素都赋初值char a5=A; char a5=A,0, 0, 0, 0,; (2)当初值多于元素个数,系统给出出错信息。)可以通过赋初值来定义数组的大小例如:int a=0,0,0,0,0,0; int a6=0; 举例说明:(见课本)编写程序,定义一个含有个元素的int 类型数组,依次给数组赋.然后按每行个顺序输出,最后在按每行个逆序输出。第二节:一维数组和指针)数组和指针
4、比较记忆:()指针变量的地址(每个变量的地址就是该变量的第一个字节的地址)数组名的地址值,就是该数组第一个元素的地址。()指针变量有基类型,相当于数组的类型名()指针变量的地址值是不可以改变,因此不可以给数组重新赋值。p=&a; 语句a=&x;或a+;都是非法的,因为不能给a重新赋值,一但定义,a永远指向a数组的首地址。)虽然不可以改变a 中的内容,但可以对数组名加一个整数的办法,来依次表达该数组中不同元素的地址。Int a10,*p,x; 例如:(k为int ) p=a+k; for(k=0;k10;k+) scanf(“%d” ,a+k); 语句p=&a0= p=a;指向a数组首地址:以下
5、语句是等价的:for(p=a,k=0;k10;k+) p+; for(p=a,k=0;k10;k+) scanf(“%d”,p);p+ for(p=a,k=0;k10;k+) scanf(“%d”,p+); for(p=a;p-a10;p+) scanf(“%d”,p);2.通过数组首地址,指针,带下标的指针引用一维数组)*&ai *(a+i) (p=a;|p=&a0; ) *(p+i) ai pi 数组a 若有:p=a; (ai *(a+i) pi *(p+i) ) 以上是数组元素ai,一对方括号不仅是表示数组元素的记号,也是一种运算符。看下面的式子:&ai a+i p+i 以上是ai的地址
6、*(p-) ai- *-p a-i(2)a和p的区别:a是不可以改变的,p中的地址值却是可以改变的,因此 a+;a=p,p=&a非法 p+,p=a,p=&ai 合法)逐个输出a数组中元素的值。for(k=0;k10;k+) printf(“%4d”.*(a+k);for(k=0;k10;k+) printf(“%4d”.ai);for(p=a,k=0;k10;k+) printf(“%4d”,*(p+k);for(k=0;k ai.数组元素地址作为实参:当数组元素地址作为实参时,因为是地址值,所以对应的形参也应该是类型相同的指针变量例如:编写程序,对具有个元素的char类型数组,从下标为的元素
7、开始,全部置*,保持前四个元素内容不变。注:setsar 函数首部可写为:Setsar(char a ,int n) 或 setsar (char aM-B, int n) *(a+i)可以写为ai 程序(略):.函数的指针形参和函数体中数组的区别:例如:以下程序,形参a指向w数组,函数体内定义了一个数组b,函数把b数组的启始地址作为函数值返回,企图使指针p指向函数体b数组的开头。define N 10 Int *fun(int aN,int n) int bN; Return b;Void main()int wN ,*p; .P=fun(w,N); 以上程序涉及几个概念:)函数fun中,形
8、参a可以写成aN,a ,*a,它是一个指针变量,在调用fun函数时,系统只为形参a开辟一个存储单元,并把main函数中w数组首地址存进去,使它指向w数组地址。)函数fun的函数体定义了一个b数组,在调用fun函数时,系统为它开辟一串连续存储单元,它是一个地址常量。)在fun函数执行完毕后,系统释放a,b所占存储单元,而b的值作为fun函数返回值,指针变量p将不指向任何对象而成为“无向指针。“一维数组的应用举例:.编写程序:定义一个含有15个元素的数组,完成以下操作:(1)调用C库函数中的随机函数给所有元素赋以050之间的随机数。(2)输出数组元素中的值(3)按顺序对每隔三个数求一个和数,并传回
9、主函数。(4)最后输出所求的和值.编写程序,将数组中数,按颠倒的顺序重新存放。.编写程序,查找在已知数组a中和k相同值的元素的位置,若找到就输出 数组a中该值和所在的位置,若没有找到输出“没有找到”。.编写程序:删除已知存放n个元素的数组a中,下标为k的元素。然后在验证。.用选择法(冒泡法)对数组a中的数进行排序。第二节:二维数组1.二维数组的定义、引用和赋初值(一)二维数组的定义和引用1.格式: 类型名 数组名常量表达式1常量表达式2; 定义数组名常量表达式1常量表达式2; 引用2.图解:(略)3.引用:考点: 1)行列下标下限为0,上限为 n-1 2)一定要使两个下标放在两个括号内。 3)
10、 第m行n列:am-1n-1(二)二维数组的初始化: 1.正常格式:int a34=1, 2, 3, 4 ,5, 6, 7, 8 ,9,10,11,12;2.缺省:行、列、不带花括号,后自动补0。(只能省略行下标,不能省略列下标)3.通过赋初值定义二维数组大小。(三)二维数组遍历方法(双for循环) 例题:通过键盘给2*3的二维数组输入数据,第一行赋1、2、3、第二行赋10、20、30、然后按行输出此二维数组。二维数组和指针:(一):二维数组名和指针 1.数组名存放的是内存中该二维数组首地址:即&a00如:p=a,即p=&a00,如上图。(二)二维数组元素表示方法1.aij : 正常格式2.(
11、*(a+i))j : ai -?*(a+i) aij -? (*(a+i)j 3.*(ai+j) : ai 中存放的是每行的首地址,可以将一行看成一个一维数组,将ai看成一维数组名。 aij -? *(ai+j) 4.*(*(a+i)+j) : ai-? *(a+i) *(ai+j) *(*(a+i)+j) 5.*(&a00+4*i+j) : 若有整型数组a34,可先将二维数组看成一维数组.从首地址开始向上每行元素个数*前面的行数+所在列数,表示当前元素的地址三:指针数组和行指针1.指针数组:1)概念:定义一个一维数组,数组中每一个元素都是一个整型指针变量。2)图解:(略)指针数组中每个指针都
12、指向二维数组的一行,也可以说每个指针存放一行的首地址。3)赋值方法(双for循环) for(i=0;i3;i+) pi=ai; ai是每行的首地址4)指针数组引用指针元素(1)pi存放一行的首地址与ai相同*(ai+j)-?*(pi+j)-? aij-?pij( 2 ) pi -? *(p+i) *(pi+j) -?*(*(p+i)+j) pij -? (*(p+i)j2.行指针:1)概念:定义一个指针变量q,它指向一个包含两个整型元素的数组。 int a32 , (*q)2;2)图解: 3) 赋初值 若 q=a,则q+1 a+1 a1 4)行指针引用数组元素。 (1)因为q=a,所以a的引用
13、方法均适用q(最后一项除外)(2) *(ai+j) ?*(*(q+i)+j) (*(q+i)j ?qij二、二维数组名和指针数组作为实参(考点)(一)二维数组名作实参 1.当实参为二维数组名时,形参必为指针,并且这个指针应指向数组,指向数组的指针变量为行指针。形参对应格式,即行指针应为:(*a)N 2.行指针也可以表示成aMN 3.行的表达式可以缺省 a N(二)指针数组做实参 1.由于指针数组中每个元素均为指针,因此对应形参应当是指向指针的指针 *a 2.与指针数组表示方式相同*aM 3.缺省 *a 三:典型例题:1. 编写程序通过调用随机函数给5*6的二 维数组元素赋1040的整数,求出二
14、维数组每行元素的平均值。2.编写函数打印杨辉三角形。3. 找出方阵每列中的最小元素及所在的行号。4. 编写函数,把任意十进制转换成二进制数。5.行列互换(多种方法)第十章 字符串:一:用一个一维数组来存放字符串。 一:定义字符串 :1.字符串的定义格式:1)0 是一个转义字符。称为“空值”。他的ASCII代码值为0。0作为标志占用存储空间,但不计入串的实际长度。2)strlen计算串的长度时不记0,sizeof计算串长度时候计算0.3)由于字符串以0结尾,所以若要定义一个函有10个字符 的字符串,则需要一个11元素的一维字符数组。例如:char str10=a,b,c,d,e,f数组str工有
15、10个元素,str作为字符串,其长度为72.字符串和字符型数组的区别。1)一维数组中不一定要存放字符串,但字 符串一定要存放在一维数组中,2) 字符数组中的每个元素可存放一个字符,但它并不限定最后一个字符应该是什么3)可以给字符内存中存放字符串,不能通过赋值语句将字符串常量或其他字符数组中的字符串直接赋给字符串变量。如:str1=str2(是错误的)二:字符串赋初值;1.为字符串赋初值1)在定义语句中赋初值(1)char str10=a,b,c,d,e,f 注意:数组元素个数一定要多于字符个数。(2)char str10=“abcdef”;(3)char str10=”abcdef”;(4)c
16、har str =”abcdef”;2)在执行语句为字符串赋初值:(1)在执行语句部分不能直接为字符串赋初值。例如:char str10; str=”abcdef”;(是错误的)(2)可以用 for循环在执行语句给字符串赋初值。 例如: for(i=0;i6;i+) stri=i;str6=0 ;2给字符型指针赋初值:1)在定义语句同时赋初值。(1)char str10= “abcdef”,*q=str;(2)char *q =”abcdef”;2)在执行语句赋初值: char *q; q=”abcdef”;3.字符把字符串赋给字符形数组和赋给字符型指针的区别:把字符串赋给字符型数组代表在内存
17、中开辟了一片连续的存储单元。把该字符串放到这片存储单元中去。把字符串赋给字符形指针,代表一个指针指向一个字符串,但并没有为它开辟存储单元。一:输入和输出字符串时的必要条件1.输出项既可以是字符串或字符数组名,也可以是已指向字符串的字符指针变量。2.输入项可以是字符数组名,也可以是字符指针,但不能是一个字符串。二:用格式说明符%s进行整串输入和输出1.scanf 函数1)用%s格式输入字符串时,空格和回车都作为输入数据的分隔符而不能被读入;2)若字符串长度超过字符数组所能容纳的字符个数时,系统并不抱错。3)当输入项为字符指针时,该指针必须已指向确定的有足够空间的连续存储单元。4)当输入项是数组元
18、素地址时,输入数据将从这一元素开始存放。看下面的一个例题:main()char a10=”*”; scanf(“%s”,a); scanf(“%d”,&a5);*/printf(“%s”,a);2.printf函数 调用printf函数时候,将从这一地址考试,依次输出存储单元中的字符,直到遇到第一个0为止。0是结束标志,不在输出字符之列。输出结束后不自动换行。三:调用 gets、puts函数,从终端进行字符串行的输入和输出。例如:main()char a10=”abcdef0g”,*p=a;Printf(“%sn”,a);Printf(“%sn”,p);Printf(“%sn”,”abcdef
19、g”);Printf(“%s.&a5”);Printf(“%sn”,a);1.gets函数。1)头文件:#include “stdio.h”2)格式:gets(str);3)gets 函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。例如:main() char a10,b10; scanf(“%s”,a);gets(b);printf(“%sn”,a); printf(“%sn”,a);2.puts函数1)头文件:#include 2)格式:puts(str);3)puts函数输出结束后,自动输出一个换行符。三字符串数组:一:概念:1.所谓字符串数组就是数组中的每个元素都是
20、一个存放字符串的数组。2.可以将一个二维字符数组看成一个字符串数组,二维字符数组的第一个下标决定了字符串的个数,第二个下标决定了字符串的最大长度。所以把他看作一个字符串数组。3.字符串数组也可以在定义的同时赋初值。例如:char a35=“a”,”bb”,”ccc”; char a 5=“a”,”bb”,”ccc”;4.可以定义字符型指针数组并通过赋初值来构成一个类似的字符串数组。例如:char *pa3=“a”,”bb”,”ccc”;二:字符串数组的操作:1.输出字符串数组main() char i ,a310=“abc”,”aa”,”cc”; for(i=0;i3;i+) printf(“%s”,ai);2.字符串排行;3.通过指针输出字符串4. main()char x10=”asqrtpyx!”,i,j; for(i=0;i串s2,函数值大于(正数);若s1s2,函数值等于;若s1s2,函数值小于(负数)比较方法:依次对s1和s2所指的字符串对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符决定所在串的大小(即两个字符的ASCII值相减);