1C语言程序设计贵州大学电气工程学院测控技术与仪器教研室王民慧数组与指针(1)本章主要内容61数组6.2指针的概念6.3指针与数组6.4字符串的指针6.5指针数组和指向指针的指针36.1数组6.1.1数组的概念6.1.2一维数组6.1.3二维数组6.1.4字符数组46.1.1数组的概念一维数组二维数组字符数组数组是有序数据的集合。数组中的每个元素都属于同一个数据类型。同一个数组的不同元素用一个统一的数组名和表示该元素在数组中位置的下标来唯一地确定。C语言中的数组有下面几种:56.1.2一维数组一维数组的定义类型说明符数组名[常量表达式];例如:inta[10];floatx[20];注意:1、数组名命名规则与变量名相同。2、常量表达式表示元素的个数。inta(10);float2x[20];如定义inta[5]后,数组中共有5个元素,分别是a[0],a[1],a[2],a[3],a[4]。6一维数组的引用数组和变量一样必须先定义后方能使用。C语言规定引用时只能引用单个元素,不能引用整个数组。数组元素的表示:数组名[下标]整型常量或整型表达式,如a[5],a[2*3],a[2*i]等。7一维数组的初始化在定义数组的同时赋初值。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};inta[10]={0,0,0,0,0,0,0,0,0,0};inta[10]={1,2,3,4,5,};在对全部数组元素赋初值时,可以不指定数组长度。如:inta[]={1,2,3,4,5,6,7,8,9};8【例6.1】Fibonacci数列问题main(){intf1,f2;inti;f1=1;f2=1;for(i=1;i=10;i++){printf(%12d%12d\n,f1,f2);if(i%2==0)printf(\n);f1=f1+f2;f2=f1+f2;}}main(){intf[20]={1,1};inti;for(i=2;i=20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i=20;i++){if(i%5==0)printf(\n);printf(%12d\n,f[i]);}}方法1:不用数组方法2:用数组赋初值赋初值边计算,边输出先计算,后输出9冒泡法简介:将相邻两个数比较,将小的调到前面。设有下面六个数,用起泡法比较的过程如下:999999854208408542085420854208542025989898989854205420542054205420【例6.2】用冒泡法对10个数排序10main(){inta[10];inti,j,t;for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n);for(j=0;j9;j++)for(i=0;i9-j;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(Thesortednumbers:\n);for(i=0;i10;i++)printf(%d,a[i]);}/*输出排序后的结果*//*从键盘输入各数组值*/冒泡法排序11【例6.3】从键盘输入5个整数,将它们反序输出。main(){inti;intnums[5];for(i=0;i5;i++)scanf(%d,&nums[i]);for(i=4;i=0;i--)printf(%5d,nums[i]);}运行情况:123457898975341212二维数组的定义类型说明符数组名[常量表达式][常量表达式];例如:inta[10][5];floatx[5][5];多维数组定义的一般形式:数据类型名数组名[常量表达式1][常量表达式2]……[常量表达式n];6.1.3二维数组13二维数组的引用先定义后使用;引用时只能引用单个元素,不能引用整个数组;数组元素的表示:数组名[下标1][下标2]二维及多维数组在内存中的存放二维数组中各元素的顺序遵照按行存放的原则。多维数组中的元素在内存中的存放顺序为按行存放,即最左边的下标变化最慢,最右边的下标变化最快。14二维数组的初始化逐行初始化;例如:inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};按数组排列的顺序对各元素赋初值;如:inta[3][3]={1,2,3,4,5,6,7,8,9};对部分元素赋初值。如:inta[3][3]={{1},{2,3},{4}};inta[][3]={{1},{2,3},{4}};思考怎样初始化矩阵:147258369不能省略15【例6.4】有一个3×4的矩阵,编写一个程序,找出其中的最大值和最小值,并输出其所在的行号和列号。main(){inti,j,row1,col1,row2,col2,max,min;inta[3][4]={{12,3,45,5},{23,34,56,1},{11,22,33,74}};max=a[0][0];min=a[0][0];for(i=0;i3;i++)for(j=0;j4;j++){if(a[i][j]max){max=a[i][j];row1=i;col1=j;}if(a[i][j]min){min=a[i][j];row2=i;col2=j;}}printf(max=%5d,row=%d,col=%d\n,max,row1,col1);printf(min=%5d,row=%d,col=%d\n,min,row2,col2);}16【例6.5】从键盘上任意键入一个3行4列的矩阵,要求输出其转置矩阵(注意换行输出)。main(){inti,j,a[3][4],b[4][3];for(i=0;i3;i++)/*输入原始矩阵a*/for(j=0;j4;j++)scanf(%d,&(a[i][j]));for(i=0;i3;i++)/*计算矩阵a的转置矩阵b*/for(j=0;j4;j++)b[j][i]=a[i][j];printf(\n);/*输出转置矩阵b*/for(i=0;i4;i++){for(j=0;j3;j++)printf(%7d,b[i][j]);printf(\n);}}176.1.4字符数组存放字符的数组称为字符数组。C语言中字符数组一般用于处理字符串,很少作为纯粹数组使用。字符数组的定义同前面定义数组的方法相同。如:chara[10];或inta[10];注意:1、字符数组中的一个元素存放一个字符。2、字符数组用于处理字符串时,字符数组中必须有一个元素的值为‘\0’,即串结束标志。18字符数组的初始化将字符逐个赋给数组元素;如:chara[10]={‘I’,’’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’};chara[]={‘I’,’’,’a’,’m’,’’,’h’,’a’,’p’,’p’,’y’};用字符串初始化。如:chara[]={“Hello”};chara[]=“Hello”;用chara[5]=“Hello”;初始化后结果是:用chara[]=“Hello”;初始化后结果是:注意:19字符数组的输入和输出用格式符“%c”逐个输入或输出;用格式符“%s”将整个字符串一次输入或输出;printf(“%s”,a);scanf(“%s”,a);不能写成&a,因为数组名代表数组的起始地址。字符数组的引用同其它数组一样,只能引用数组元素。20【例6.6】逐个字符输出“Hello,World!”。main(){charc1[12]={'H','e','l','l','o',',','W','o','r','l','d','!'};inti;for(i=0;i12;i++)printf(%c,c1[i]);printf(\n);}运行后,屏幕上显示:Hello,World!21【例6.7】用“%s”格式符输入、输出字符串。main(){charc3[10];staticcharc4[]={aregood.};scanf(%s,c3);printf(%s%s\n\n,c3,c4);}运行后,键入:Youare屏幕上显示输出:Youaregood.使用scanf函数时,输入的字符串中如果含有空格或制表符,系统遇到时会认为输入结束,接着自动在字符串的末尾加上结束标志‘\0’。22字符串处理函数1、puts(字符数组)2、gets(字符数组)3、strcat(字符数组1,字符数组2)4、strcpy(字符数组1,字符串2)5、strcmp(字符串1,字符串2)6、strlen(字符数组)7、strlwr(字符串)8、strupr(字符串)23【例6.8】使用gets函数和puts函数实现二维字符数组的输入、输出。#includestdio.hmain(){charstring[3][15];inti;for(i=0;i3;i++)/*输入多个字符串*/gets(string[i]);printf(Theoutputis:\n);for(i=0;i3;i++)/*输出多个字符串*/puts(string[i]);}24字符串处理函数字符串连接函数strcat(串1,串2)功能:连接两个字符串,将“字符串2”接在“字符串1”的后面,“字符串2”不变。字符串比较函数strcmp(串1,串2)功能:若“字符串1”“字符串2”,则函数返回值为一正整数,其值为两字符ASCII代码的差;若“字符串1”“字符串2”,则函数返回值为一负整数,其值仍然为两字符ASCII代码的差。求串长函数strlen(串)功能:测试“字符串”的实际长度。长度为“字符串”中有效字符的个数(不包含字符串尾部的‘\0’)25字符串拷贝函数strcpy(串1,串2)功能:将“字符串2”拷贝到“字符串1”中去。注意:不能使用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。如下面都是不合法的:str1={“abcd”};str1=str2;转换小写字母函数strlwr(串)功能:将“字符串”中的大写字母转换成小写字母。转换大写字母函数strupr(串)功能:将“字符串”中的小写字母转换成为大写字母。26【例6.9】字符串拷贝示例。#includestring.hmain(){staticcharstr1[40]={white},str2[]={snow};puts(strcpy(str1,str2));printf(%s\n,strcpy(str1,Redrose));}运行该程序的结果:snowRedrose字符串函数定义在头文件string.h中27【例6.10】任意键入3个字符串,编程找出最小的一个。#includestring.hmain(){charstring[30];charch[3][30];inti;for(i=0;i3;i++)gets(ch[i]);strcpy(string,ch[0]);for(i=1;i3;i++)if(strcmp(ch[i],string)0)strcpy(string,ch[i]);printf(Theresultis:\n%s\n,string);}