您好,欢迎访问三七文档
二维数组一、定义在逻辑上可以把二维数组看成一个具有行和列的矩阵。123456789定义格式:类型名数组名[整型常量1][整型常量2],..….;例:inta[3][3];说明:1、定义了一个数组名为a的二维数组;2、二维数组a中每个元素都是int;3、二维数组a中有3*3个元素;4、二维数组a可以看成是一个具有3行3列的矩阵。第0列第1列第2列第0行a[0][0]a[0][1]a[0][2]第1行a[1][0]a[1][1]a[1][2]第2行a[2][0]a[2][1]a[2][2]二维数组中每个元素有两个下标,第一个方括号中的下标代表行号,称行下标;第二个方括号中的下标代表列号,称列下标。行下标和列下标都是从0开始。二维数组在内存中也是占用连续的存储单元。如图所示:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]说明:1、在C语言中,可以把二维数组看成一个一维数组,每个数组元素又是一个一维数组。2、二维数组名同样存放的是地址常量,代表该数组的首地址,即第一个数组元素的地址。二、二维数组元素引用数组名[下标表达式1][下标表达式2]doublew[4][2];w[0][1]、w[i][j]、w[i+k][j+k]——都是合法的数组元素引用形式三、二维数组的初始化inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};inta[3][3]={{1,2},{3,4}};例1:通过键盘给2*3的二维数组输入数据,第一行赋1、2、3,第二行赋10、20、30,然后按行输出此二维数组。#includestdio.hmain(){inta[2][3],i,j;/*输入数据*/for(i=0;i2;i++)for(j=0;j3;i++)scanf(“%d”,&a[i][j]);/*输出数据*/for(i=0;i2;i++){for(j=0;j3;i++)printf(“%d”,&a[i][j]);printf(“\n”);}}四、二维数组名作为实参时实参和形参之间的数据传递当二维数组名作为实参时,对应的形参是一个行指针变量。行指针:int(*prt)[2];inta[3][3];prt=a;a[0]a[1]a[2]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[2][0]a[2][1]a[2][2]prtprt++;/*行指针prt每次移动为一行*/intx[10],*p;p=x;xx[0]x[1]x[2]x[3]x[4]x[5]x[6]x[7]x[8]x[9]pp++;/*指针p每次移动为一个单元*/五、程序举例1、二维数组的输入输出#defineM6#defineN5inta[M][N];输入:for(i=0;iM;i++)for(j=0;iN;j++)a[i][j]=rand()%50;输出:for(i=0;iM;i++)for(j=0;iN;j++)printf(“%d”a[i][j]);2、计算方阵每行的和值、平均值、最大值、最小值。#includestdio.h#defineM5ints[M][M]={{23,87,10,44,11},{91,66,24,5,51},{31,2,19,91,28},{65,10,9,6,39},{22,35,49,82,76}};intx[M]={0};voidjisuan(){inti,j;for(i=0;iM;i++){sum=0;for(j=0;jM;j++)sum=sum+s[i][j];x[i]=sum;}}main(){inti;jisuan();for(i=0;iM;i++)printf(“%d”x[i]);}字符串“Hello!”字符串常量在内存中占用一串连续的存储空间。不同的字符串具有不同的起始地址。在C语言中,字符串常量被隐含处理成一个以‘\0’结尾的无名字符型一维数组。一、字符数组、字符串(1)charstr[10]={‘s’,‘t’,‘r’,‘i’,‘n’,‘g’,‘!’};str:string!000str[0]str[1]str[2]str[3]str[4]str[5]str[6]str[7]str[8]str[9](2)charss[10]=“string!”;ss:string!\0\0\0ss[0]ss[1]ss[2]ss[3]ss[4]ss[5]ss[6]ss[7]ss[8]ss[9](3)charss[]=“string!”;ss:string!\0ss[0]ss[1]ss[2]ss[3]ss[4]ss[5]ss[6]ss[7](4)charss[]=“string!”,*p;p=ss;ss:string!\0ss[0]ss[1]ss[2]ss[3]ss[4]ss[5]ss[6]ss[7]p(5)char*p=“string!”;string!\0p二、字符串的输入和输出1、scanf()和printf()实现字符串的整体输入和输出(1)scanf(“%s”,输入项);说明:输入项可以是字符数组名,字符数组元素地址,也可以是字符指针变量。例:charstr[15];scanf(“%s”,str);注意:用%s格式符输入时,空格和回车符都作为输入数据的分隔符而不能被读入。(2)printf(“%s”,输出项);说明:输入项可以是字符串常量、字符数组名,也可以是指向字符串的字符指针变量。2、gets()和puts()(1)gets()函数:输入一行字符串格式:gets(str_adr);说明:str_adr可以是字符数组名、字符数组元素地址或字符指针变量。作用:从终端设备(键盘)读入字符串(包括空格),直到读入一个换行符为止。换行符读入后,不作为字符串的内容,系统自动用‘\0’代替。例:charstr[20];gets(str);(2)puts()函数:输出一行字符串格式:puts(str_adr);说明:str_adr可以是字符数组名、字符数组元素地址或字符指针变量。作用:从终端设备(屏幕)输出字符串(包括空格),直到第一个‘\0’即结束输出。三、字符串数组定义:字符串数组就是数组中的每个元素又都是一个字符串。charname[10][80];说明:字符串数组的第一个下标决定字符串的个数,第二个小标决定字符串的最大长度。charca[3][5]={“a”,“bb”,“ccc”};ca[0][0]ca[0]a\0ca[1]bb\0ca[2]ccc\0四、字符串处理函数char*s1,*s2,*s,ch;strcat(s1,s2):把字符串s2连接到s1后面,返回s1所指地址。strcmp(s1,s2):对s1和s2所指字符串进行比较(区分大小写)。s1s2,返回负数;s1==s2,返回0;s1s2,返回正数。char*s1,*s2;s1=”strstringstr”;s2=”int”strcmp(s1,s2);stricmp(s1,s2):对s1和s2所指字符串进行比较(不区分大小写)。s1s2,返回负数;s1==s2,返回0;s1s2,返回正数。strcpy(s1,s2):把s2指向的字符串复制到s1指向的空间,返回s1所指地址。strlen(s):求s所指字符串的长度。返回字符串中字符的个数。strchr(s,ch):在s所指字符串中找出第一次出现字符ch的位置。返回找到的字符的地址,找不到返回NULL。char*p=”string”,ch;ch=’n’;strchr(p,ch);strstr(s1,s2):在s1所指字符串中找出字符串s2第一次出现的位置。返回找到的字符串的地址,找不到返回NULL。char*s1,*s2;s1=”strstringstr”;s2=”str”strstr(s1,s2);其他函数(讲解习题时再介绍):如:memset();memcpy();atoi();五、程序举例字符串是否结束的判断方式1、一维数组charss[]=“string!”,*p;p=ss;ss:string!\0ss[0]ss[1]ss[2]ss[3]ss[4]ss[5]ss[6]ss[7]p(1)for(i=0;ss[i]!=’\0’;i++)(2)for(i=0;ss[i];i++)(3)for(i=0;istrlen(ss);i++)2、二维数组(字符串数组)charca[10][20],*p;for(i=0;i10;i++){p=ca[i];n=strlen(p);for(j=0;jn;j++){}}3、题库例题
本文标题:第八讲二维数组
链接地址:https://www.777doc.com/doc-2191409 .html