1、第五章第五章指 针 与 数 组一维数组与指针一维数组与指针字符数组、字符串与字符指针字符数组、字符串与字符指针字符串处理函数字符串处理函数数组的基本概念C 数据类型基本类(简单类) 字符型 /整型 /实型 /枚举型( enum)构造类(组合类) 数组 /结构体 /共用体指针类空类型( void)基本类型 单个出现的变量,每个变量可代表一确定的数据(变量值),且具有一定属性。【 例 】 static int x,y;但变量间不存在确定的相互关系。构造类型 由基本类型按一定规则组成。其中:数组:由一组有序数据(数组元素)组成。每个元素:相同类型,统一数组名,由下标定顺序,可各自取值。【 例 】 s
2、tatic int a5;其中: 表示 a是个数组,而不是一个简单变量 a。 5表示该数组共有 5个元素。元素编号从 0开始, a0表示第一个元素, a4表示第 5个元素(最后一个)。数组的基本概念数组的用处很多。【 例 】 要读入某班全体 50位同学某科学习成绩,然后进行简单处理(求平均成绩、最高分、最低分 )。若用简单变量,需 50个不同变量名,如 stu1,stu2,stu50 ,要用很多个scanf命令。而用数组,可共用一个 scanf命令,并利用循环结构读取。#include #define NUM 50;void main(void) int i, scoreNUM, highes
3、t;float sum=0, average;for (i=0; ihighest) highest = ai;printf(“最高分是: %dn”, highest) ;数组的基本概念所谓数组,实际为 一组同质 (同数据类型 )元素的有序集合 ,数组在内存中占用一片 连续 的存储空间,数组元素可通过下标访问任一数组元素。数组元素的数据类型称为数组的基类型。可以是前述的简单类型,也可是指针或构造类型。许多重要应用皆基于数组。计算机系统根据数组定义的大小,为数组分配一段连续的内存空间。同一数组的所有元素均保存在此,又因为各元素同质,即所占内存大小相等,故可以通过数组下标访问各数组元素。数组的四大
4、要素: 数组名,同变量标示符。但数组名后 不可少。 数组的类型,既数组的基类型。 数组的结构,用于说明数组的维数和数组元素的个数。 数组的存储类型。数组的四大要素通过定义数组的说明语句通知编译系统。一维数组的定义与一般变量相同,数组也应当先定义,再引用。格式: 类型说明符 数组标示符 常量表达式 ;说明数组的数据类型 数组名 表示数组大小 初始化值【 例 】 int array10, number20;类型说明符 数组标示符 常量表达式char ch15;【 注 】 数组标示符与一般变量标示符的区别:数组名后有一对方括号 。 方括号 用于表述数组的维数和大小,必须为常量表达式。 C语言不支持变
5、界数组 (数组定义时必须预先指定数组的大小 )。int i;char chi; / 非法 一维数组名有 2个含义:表示数组标示符;表示系统分配给数组的存储区的首地址 (指针 )。 scanf(“%c”, scanf(“%c”, ch); 与一般变量相同,类型说明含数据类型说明和存储类型说明。 数组元素的 下标值由 0开始 , 最大下标值为 中的常量表达式 1。 数组名表示数组存储区的首地址,即数组第一个元素存放的地址。 C 语言中不允许出现动态数组说明,即数组的长度不能依赖运行过程中变化着的变量。【 例 】 int i; scanf (“%d”, char arrayi; 数组 arrayi的
6、长度依赖于变量 i的输入结果,这是不允许的。一维数组的初始化使数组元素得到值,可以有三种基本途径(1)用赋值语句;(2)用输入语句;(3)初始化。前两种方式占运行时间,而初始化数组,可以使程序在运行之前的编译阶段得到初值 。 所谓数组的初始化,就是在定义数组时为数组元素赋初值。类型说明符 数组标识符 常量表达式 = 常量表达式 ; 其中: “=常量表达式表 ”为赋初值部分, 中各常量表达式是对应的数组元素初始,它们相互之间用逗号分隔。例如: int a4=0,1,2,3; 它等价于 static int a4; a0=0;a1=1;a2=2;a3=3;由于数组长度可由初值个数确定,故可以写成:
7、static int a =0,1,2,3;数组初始化的特点:(1) 当数组指明的元素个数大于初值个数时,则表明初值只赋给数组开始的若干元素,余下部分为相应类型的缺省值。例如: static int a5=0,1,2,3; 它表示 a0=0, a1=1, a2=2, a3=3, a4=0(2) 不允许数组指明的元素个数小于初值个数,否则作语法出错处理。 例如: static int a6 = 0, 1, 2, 3, 4, 5, 6, 7; 是错误的。(3) 不允许对数组元素整体赋值,只能对数组元素逐个赋初值。要使数组 a中的全部元素初值为 0,可写成: static int a4=0,0,0,
8、0; 而不能写成: static int a4=0*10; 其实,按照上述 (1)的规定,对 static数组不赋初值,系统会自动对全部数组元素赋以 0值。 即: static int a4;相当于 a0a3全部都赋以初值 0。(4) 在对数组元素全部赋初值时,可以不指定数组长度,其长度由所赋初值的个数自动确定 。如: static int a =1,2,3,4; a数组的初值有 4个,故系统自动确定 a的长度为 4。一维数组的引用C 规定:对数组只能逐个引用, 不能整体引用 。原因:数组是一个数据类型的聚集,它本质上不是基本数据类型。将数组 a 赋给数组 b:int a10 = 0, 1,
9、2, 3, 4, 5, 6, 7, 8, 9 , b10, i;for ( i=0; ivoid main(void)int a10, i;for (i=0; ivoid main(void)int a23 = 1, 2, 3, 4, 5, 6;int b6, i, j;for (i=0; ivoid main(void)int a222; / 3 维数组 aint i, j, k, min; for (i=0; i aijk) min = aijk; / 选择最小值printf(“最小值 = %dn”, min);将 改为 =i; j-) / 内层循环if (itemj-1itemj) /
10、对应递增,递减时改为 #define N 5void main(void)int i, j, itemN;int temp;printf(“input %d numbers:n“, N);for (i=0; i=i; j-)if (itemj-1itemj) temp = itemj-1;itemj-1 = itemj;itemj = temp;printf(“n“);for (i=0; i#define N 5void main(void)int i, j, itemN;int i, j, k, temp;printf(“input %d numbers:n“, N);for (i=0; i
11、=0 /中项值 待查数,舍弃右边if (itemmiddle= data) return (middle)return (-1); 【 例 】 有 15个数存放在一个数组中,输入一个数,用折半查找法找出该数是数组中第几个元素。若该数不在数组中,则打印出 “No found”。#include #define N 15void main(void) int NumberN=1,5,2,3,9,6,8,7,14,10,15,22,19,16,18;int i, j, temp, left=0, right=N-1,middle, search=10;for (i=1; i=i; j-)if (Nu
12、mberj-1Numberj) temp = Numberj-1; Numberj-1 = Numberj; Numberj = temp;while (leftsearch) right = -middle;if (Numbermiddle = search)break;if (leftvoid main(void) int array10 = 1, 2, 4, 5, 6, 0, 0, 0, 0, 0, i;printf(“n“);for (i=0; i=2; i-) arrayi = arrayi-1; / 后移 9-2=7次array2 = 3;for (i=0; i#define M
13、4#define N 2#define P 3void main(void)int aMP, bPN, multiMN;int i, j, k;printf(“Input array a%2d%2d:n“, M, P);for (i=0; i#define M 8#define OUT 1void main(void)int menM;int i, N, j=0, count=0;printf(“Input N:“);scanf(“%d“, / 输入 N/ 初始化for (i=0; iM; i+) meni = 0;i = -1;do /遍历数组,使 M人出列i +; if (i=M) i = 0; / 若到尾,则置为 0/ 跳过已出圈者while (meni=OUT) i +;if (i=M) i = 0; / 到尾,置 0if (+j%N=0) / 某人数到 N,出圈meni = OUT;count +;printf(“%d “, i+1); while (count!=M);