为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

c语言程序设计 第五章+数组

2010-12-23 50页 ppt 280KB 152阅读

用户头像

is_768820

暂无简介

举报
c语言程序设计 第五章+数组nullnull教学目标:   本讲介绍C语言中数组的定义和使用,其中重点介绍一维数组的定义、引用、初始化,此外对二维数组的定义、引用和初始化在文中也作了详细的说明。要求大家熟练掌握一维数组的使用,了解的二维数组的应用,灵活运用数组编程。 本讲重点 : 1.一维数组的定义、初始化及应用; 2.数组元素的引用方法:下标法、数组名法。 3.字符串的使用和字符串函数的应用。 本讲难点: 1.利用指针实现对数组的操作;  2.二维数组的应用。 教学方法:理论教学与实践教学相结合。   null5.1 一维数组及指针  ...
c语言程序设计 第五章+数组
nullnull教学目标:   本讲介绍C语言中数组的定义和使用,其中重点介绍一维数组的定义、引用、初始化,此外对二维数组的定义、引用和初始化在文中也作了详细的说明。要求大家熟练掌握一维数组的使用,了解的二维数组的应用,灵活运用数组编程。 本讲重点 : 1.一维数组的定义、初始化及应用; 2.数组元素的引用方法:下标法、数组名法。 3.字符串的使用和字符串函数的应用。 本讲难点: 1.利用指针实现对数组的操作;  2.二维数组的应用。 教学方法:理论教学与实践教学相结合。   null5.1 一维数组及指针  5.2 一 维字符数组及指针 5.3 多维数组及指针 5.4 指针数组 5.5 二级指针 5.6 程序设计举例 第五章 数组null5.1 一维数组及指针 数组属于构造类型,数组是具有相同数据类型的变量的序列,序列中的每个变量称为数组元素,数组元素用一个统一的标识符“数组名”和其顺序号“下标”来表示。数组可以是一维的,也可以是多维的。数组必须先定义后使用。 null5.1.1. 一维数组的定义和初始化   1.一维数组的定义   一维数组定义的一般形式为: 类型标识符 数组名[常量表达式] 其中,类型标识符表示数组的数据类型,即数组元素的数据类型,可以是任意数据类型,如整型、实型、字符型等。常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。数组名要遵循标识符的取名规则。 如:int a[10]; 定义了一个一维数组,数组名为a,数据类型为整型,数组中有10个元素,分别是:a[0],a[1],a[2],a[3],a[4], a[5],a[6],a[7],a[8],a[9]。 null说明: ① 不允许对数组的大小作动态定义。如下面对数组的定义是错误的。 int n=10; int a[n]; ② 数组元素的下标从0开始。如数组a中的数组元素是从a[0]到a[9]。 ③ C语言对数组元素的下标不作越界检查。如:数组a中虽然不存在数组元素a[10],但在程序中使用并不作错误处理,所以在使用数组元素时要特别小心。 ④ 数组在内存分配到的存储空间是连续的,数组元素按其下标递增的顺序依次占用相应字节的内存。数组所占字节数为:sizeof(类型标识符)*数组长度。如数组a占用连续20个字节存储空间,为其分配的内存见图5.1。 null图5.1⑤ 在函数内或函数外可以同时定义多个数组,还可以同时定义数组和变量,如: float a[10],b[20],c,d,*p; 但在函数的参数中一次只能定义一个数组 。 2.一维数组初始化   在定义数组的同时,可以对数组的全部元素或部分元素赋初值,称为数组的初始化。 ① 全部元素初始化。 在对全部数组元素初始化时,可以不指定数组长度。null如:下面对数组a的初始化是等价的: int a[10]={0,1,2,3,4,5,6,7,8,9}; int a[ ]={0,1,2,3,4,5,6,7,8,9}; a[0]到a[9]的值分别为:0,1,2,3,4,5,6,7,8,9。 Turbo C中,若数组的存储类型为static,且没有初始化,编译系统自动对数组初始化,将数值型数组的全部元素都初始化为0,将字符型数组的全部元素都初始化为空(’\0’)。如: static int a[10];/*数组元素a[0]到a[9]的值都为0。*/ ② 部分元素初始化。 部分元素初始化时,数组的长度不能省略,并且是赋值给前面的元素,没有被赋值的数组元素,数值型数组时值为0,字符型数组时值为’\0’。如: int a[10]={1,2};/*a[0]的值为1,a[1]的值为2,a[2]到a[9]的值都为0*/ null5.1.2 一维数组元素的下标法引用  一维数组元素的下标表示形式为: 数组名[表达式] 其中,表达式的类型任意,一般为算术表达式,其值为数组元素的下标。 用下标法引用数组元素时,数组元素的使用与同类型的普通变量相同。 若有定义:int a[10]={1,2,3,4,5,6,7,8,9,10},i=3;则下列对数组元素的引用都是正确的: a[i] /*表示a[3] */ a[++i] /*表示a[4] */ a[3*2] /*下标6的数组元素*/nulla[3.4] /*下标为实型数据,系统自动取整,表示a[3]*/ a[’b’-’a’] /*下标为表达式,表达式’b’-’a’的值为1,表示 a[1]*/ a[4]+=10 /*与a[4]= a[4]+10等价,表示将a[4]的原值加10*/ a[4]++ /*与a[4]= a[4]+1等价,表示将a[4]的原值加1*/ 【例5.1】将整型数组a中的十个整型数逆序存放并输出。 main() { int a[10],i,j,t; for(i=0;i<10;i++) /* 输入10个整型数存入数组a中 */ scanf("%d",&a[i]); for(i=0,j=9;ia为真,p>a+4为假。 null5.1.4 一维数组元素的指针法引用 由前面的介绍可知,若有定义: int a[10],*p=a; 则&a[i]、(a+i)和(p+i)是等价的,它们都表示数组元素a[i]的地址。由此可得下列等价关系:a[i]、*(a+i)和*(p+i)等价。它们都表示下标为i的数组元素。由此可知,一维数组元素除了可以用下标法引用外,还可以用指针法引用。 1.数组名法 用数组名引用数组元素的一般形式为: *(数组名+表达式) 其中,表达式类型任意,一般为算术表达式,其值为数组元素的下标。 如:*(a+3-1)表示数组元素a[2]。 null【例5.2】用数组名法实现例5.1。 main() { int a[10],i,j,t; for(i=0;i<10;i++) scanf("%d",a+i); for(i=0,j=9;i ② 输出的字符串中可以包含转义字符,并输出到第一个’\0’为止,并将’\0’转换为’\n’,即输出完字符串后回车换行。 如:char str[]="china\nliaoning\0jinzhou"; 输出结果为:china liaoning ③ puts()函数一次只能输出一个字符串。 null2.字符串输入函数—gets() 一般调用格式为:gets(str) 其中,参数str是地址表达式,一般是数组名或指针变量。 功能:从终端(一般指键盘)输入一个字符串,存放到以str为起始地址的内存单元。 返回值:字符串在内存中存放的起始地址,即str的值。 如:char str[20]; gets(a); 把从键盘上输入的字符串存放到字符数组str中。 说明: ① 使用gets()函数的函数前面要有文件包含: #include "stdio.h" 或 #include ② gets()函数一次只能输出一个字符串。 ③ 系统自动在字符串后面加一个字符串结束标志’\0’。 null3.字符数组的输出 可以用两种方法输出字符数组: (1) 单个字符输出。用格式输出函数printf()的%c的格式,或用字符输出函数putchar()。 (2) 将整个字符串一次输出。用格式输出函数printf()的%s格式,或用字符串输出函数puts()。 将整个字符串一次输出时要注意以下几点: ① 输出字符不包括字符串结束标志’\0’。 ② printf()的%s格式的输出项参数和puts()的参数是地址表达式,而不是数组元素名。 如:char str[10]="China"; printf("%s",str); /*输出:China */ puts(str+2); /*输出:ina */null③ 如果数组长度大于字符串的实际长度,也只输出到’\0’结束。 ④ 如果一个字符数组中包含一个以上的’\0’,则遇到第一个’\0’ 输出结束。 如:char str[10]="china\0usa"; printf("%s",str); 输出结果为:china null4.字符数组的输入 字符数组输入也有两种方法: (1) 单个字符输入。可以用格式输入函数scanf()的%c格式,或用字符输入函数getchar()。 (2) 将整个字符串一次输入。可以用格式输入函数scanf()的%s格式,或用字符串输入函数gets()。 将整个字符串一次输入时要注意以下几点: ① 用scanf()的%s格式不能输入含有空格的字符串,遇到空格系统认为输入结束,所以用scanf()函数一次能输入多个不含空格的字符串。用gets()函数能够输入含有空格的字符串,但一次只能输入一个字符串。 null如:char str1[12]; scanf("%s",str1); printf("%s",str1); 数据输入:how are you↙ 输出结果:how 字符数组str1的内容见图5.6。图5.6如果改为: char str1[12]; gets(str1); printf("%s",str1); 数据输入:how are you↙ 输出结果:how are you null字符数组str1的内容见图5.7。(□代表空格) 图5.7如果改为: char str1[4],str2[4],str3[4]; scanf("%s%s%s",str1,str2,str3); printf("%s\n%s\n%s",str1,str2,str3); 数据输入:how are you↙ 输出结果:how are you 字符数组str1、str2和str3的内容见图5.8。 null② 系统自动在最后一个字符的后面加上一个字符串结束符’\0’。 ③ scanf()的%s格式的输入项是数组名时,数组名前不能加取地址符“&”,因为数组名本身代表数组的首地址。 null5.2.3 用字符数组实现字符串 若字符串存放在字符数组中,对字符串中字符的引用可以用下标法,也可用指针法。其引用形式和前面介绍的一维数组元素的引用相同。 1.用下标法引用 【例5.5】将一个字符串逆置后接到原串的后面。 #include "stdio.h" main() { char str[81]; int i,j; gets(str); i=0; while(str[i]!= ’\0’) i++; nullj=i; i--; while(i>=0) {str[j]=str[i]; i--; j++; } str[j]= ’\0’; puts(str); } 〖运行结果〗: abc↙ abccba   null2.用数组名法引用 【例5.6】将字符数组a中的字符串复制到字符数组b。 #include "stdio.h" main() { char a[81],b[81]; int i=0; gets(a); while(*(a+i)!= ’\0’) {*(b+i)=*(a+i); i++; } *(b+i)= ’\0’; puts(b); } 〖运行结果〗: china↙ china null3.用指针变量法引用 【例5.7】删除字符串尾部空格。 #include "stdio.h" main() { char str[80],*p; gets(str); p=str; while(*p) p++; p--; while(*p==’ ’) p--; p++; *p=’\0’; printf("%s",str); }〖运行结果〗: abcd□□□□□↙ abcd /*光标在d的后一列上*/ null5.2.4 用字符指针变量实现字符串   除了能用字符数组处理字符串外,还可以用字符指针变量。如: char *str="china"; 等价于: char *str; str="china"; 其含义为:定义了一个字符型指针变量str,并将字符串"china“ 的首地址赋给它,即str指向字符串的第一个字符“c”。 null【例5.8】 #include "stdio.h" main() { char *p1="china"; char *p2; puts(p1); p2=p1; puts(p2+2); } 〖运行结果〗: china ina null虽然用字符数组和字符指针变量都能实现对字符串的处理,但它们之间是有区别的,主要注意以下几点: ① 字符数组有若干个元素组成,每个元素中存放一个字符,而字符指针变量中存放的是字符串的首地址,而不是将字符串存放到指针变量中。 ② 不能用赋值语句将一个字符串常量或字符数组直接赋给字符数组,但可以用赋值语句将一个字符串常量或字符数组的首地址直接赋给指针变量。如有定义: char str1[10]="china",str2[10],*p1,*p2; 下面的赋值是不合法的: str2=str1; str2="USA"; null下面的赋值是合法的: p1=str1; /*把数组str1的首地址赋给p1*/ p2="USA"; /*把字符串"USA"的首地址赋给p2*/ ③ 使用数组名可以安全地把从键盘上输入的字符串存放到字符数组中,但用未赋以地址值的指针是危险的。如: char *p; scanf("%s",p); 虽然一般也能运行,但有可能破坏其他程序。 ④ 使用字符指针变量处理字符串比用字符数组处理字符串节省内存。如: char *p="china"; 是把字符串常量"china"的地址赋给指针变量p,而 char str[]="china"; 是将字符串常量"china"拷贝到字符数组,"china"的地址与数组str的地址不同。 null5.2.5 常用字符串处理函数   在Turbo C的 string.h头文件中提供了一些专门用来处理字符串的函数,下面介绍其中几个最常用的函数。 1.字符串拷贝函数—strcpy() 一般调用格式:strcpy(str1,str2) 其中,str1是地址表达式(一般为数组名或指针变量)str2可以是地址表达式(一般为数组名或为指针变量),也可以是字符串常量。 功能:将str2指向的字符串拷贝到以str1为起始地址的内存单元。 返回值:str1的值。 如:char str1[40],str2[]="china"; strcpy(str1,str2); puts(str1); 输出结果为:chinanull说明: ① 以str1开始的内存单元必须定义的足够大,以便容纳被拷贝的字符串。 ② 拷贝时连同字符串后面的’\0’一起拷贝。 ③ 不能用赋值语句将一个字符串常量赋给一个字符数组,也不能将一个字符数组赋给另一个字符数组,只能用strcpy()函数处理。如: char str1[10]="china",str2[10]; 下面的赋值是不合法的: str2=str1; str2="USA"; 下面的赋值是合法的: strcpy(str2,str1); strcpy(str2,"USA"); null2.字符串连接函数—strcat()  一般调用格式:strcat(str1,str2) 其中,str1是地址表达式(一般为数组名或指针变量)。str2可以是地址表达式(一般为数组名或为指针变量),也可以是字符串常量。 功能:把str2指向的字符串连接到str1指向的字符串的后面。 返回值:str1的值。 如:char str1[40]="china",str2[]="beijing"; strcat(str1,str2); puts(str1); 输出结果为:chinabeijing null说明: ① 以str1开始的内存单元必须定义的足够大,以便容纳连接后的字符串。 ② 连接后,str2指向的字符串的第一个字符覆盖了连接前str1指向的字符串的结束符’\0’。只在新串的最后保留一个’\0’。 ③ 连接后,str2指向的字符串不变。 null3.字符串比较函数—strcmp() 一般调用格式:strcmp(str1,str2) 其中,str1和str2可以是地址表达式(一般为数组名或指针变量),也可以是字符串常量。 功能:比较两个字符串。 返回值:如果两个字符串相等,返回值为0;如果不相等,返回从左侧起第一次不相同的两个字符的ASCII码的差值。 如:printf("%d\n",strcmp("acb","aCb"); 输出结果为:32(’c’和’C’的ASCII码差值) 说明: ① 字符串比较是从左向右比较对应字符的ASCII码值。 ② 两个字符串比较不能用关系运算符,只能用strcmp()函数。 ③ 不能用strcmp()函数比较其他型数据。   null4.测试字符串长度函数—strlen() 一般调用格式:strlen(str) 其中,str可以是地址表达式(一般为数组名或指针变量), 也可以是字符串常量。 功能:统计字符串str中字符的个数(不包括结束符’\0’)。 返回值:字符串中实际字符的个数。 如:char str[10]="china"; printf("%d",stren(str)); 输出结果是5,不是10,也不是6。 null5.字符串小写变大写函数—strupr() 一般调用格式:strupr(str) 其中,str可以是地址表达式(一般为数组名或指针变量), 也可以是字符串常量。 功能:将字符串中的小写字母转换成大写字母。 返回值:str的值,即字符串的首地址。 如:puts(strupr("aB3c")); 输出结果为:AB3C。 null6.字符串大写变小写函数—strlwr() 一般调用格式:strlwr(str) 其中,str可以是地址表达式(一般为数组名或指针变量),也可以是字符串常量。 功能:将字符串中的大写字母转换成小写字母。 返回值:str的值,即字符串的首地址。 如:puts(strupr("aB3c")); 输出结果为:ab3c。 【例5.9】有两个字符串,按由小到大的连接在一起。 #include "stdio.h" #include "string.h"nullmain() { char str1[20],str2[20],str3[60]; gets(str1); gets(str2); if(strcmp(str1,str2)>0) {strcpy(str3,str1); strcat(str3,str2); } else {strcpy(str3,str2); strcat(str3,str1); } puts(str3); }   〖运行结果〗 China↙ American↙ AmericanChinanull3.3 多维数组及指针   除了一维数组外,C语言还允许使用二维、三维等多维数组,数组的维数没有限制。除了二维数组外,其他多维数组一般很少用到,所以下面重点介绍二维数组。   3.3.1 二维数组的定义和初始化   1.二维数组的定义   二维数组定义的一般形式为: 类型标识符 数组名[常量表达式1][ 常量表达式2] 其中,常量表达式1的值是行数,常量表达式2的值是列数。 如: int a[3][4]; null定义了一个整型的二维数组,数组名为a,行数为3,列数为4,共有12个元素,分别为:a[0][0],a[0][1],a[0][2],a[0][3],a[1][0],a[1][1],a[1][2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3]。 C语言中,对二维数组的存储是按行存放,即按行的顺序依次存放在连续的内存单元中。如二维数组a的存储顺序如图5.9所示。 C语言对二维数组a的处理方法是:把a看成是一个一维数组,数组a包含三元素:a[0],a[1],a[2]。而每个元素又是一个一维数组,各包含四个元素,如a[0]所代表的一维数组又包含四个元素:a[0][0],a[0][1],a[0][2],a[0][3]。见图3.10。 null由于系统并不为数组名分配内存,所以由a[0]、a[1]、a[2]组成的一维数组在内存并不存在,它们只是表示相应行的首地址。 C语言中,多维数组定义的一般形式为: 类型标识符 数组名[常量表达式1][ 常量表达式2]…[ 常量表达式n] null2.二维数组的初始化 ① 全部元素初始化 全部元素初始化时,第一维的长度,即行数可以省略,第二维的长度,即列数不能省略。可以用花括号分行赋初值,也可以整体赋初值。 如:下列初始化是等价的: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int a[ ][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12}; ② 部分元素初始化 部分元素初始化时,若省略第一维的长度,必须用花括号分行赋初值。没初始化的元素,数值型数组时值为0,字符型数组时值为’\0’。null如:下列初始化是等价的: int a[3][4]={1,2,3,4,0,5}; int a[3][4]={{1,2,3,4},{0,5}}; int a[ ][4]={{1,2,3,4},{0,5}}; 见图5.11。 下面是对二维字符型数组的初始化: char str[3][6]={"china","USA","japan"}; 三个一维数组str[0],str[1],str[2]各有6个元素,其值分别为:“china”、“USA”和“japan”。见图5.12。 null5.3.2 二维数组元素的下标法引用   数组元素在使用时与同类型的普通变量相同,可以出现在表达式中,也可以被赋值。使用时要特别注意下标的范围。 二维数组元素的下标表示形式为: 数组名[表达式1] [表达式2] 其中,表达式1和表达式2的类型任意,一般为算术表达式。表达式1的值是行标,表达式2的值是列标。 【例3.10】求3×4矩阵的最小值,及其所在的位置(行号和列号)。 nullmain() { int a[][4]={{2,-8,20,0},{9,5,-38,-34},{10,32,4,-3}}; int i,j,row,col,min; min=a[0][0]; row=0; col=0; for(i=0;i<3;i++) for(j=0;j<4;j++) if(min>a[i][j]) { min=a[i][j]; row=i; col=j; } printf("min=%d,row=%d,col=%d",min,row,col); } 〖运行结果〗: min=-38,row=1,col=2 null5.3.3 二维数组的指针 C语言规定,二维数组的数组名代表整个二维数组的首地址,二维数组的数组名加1是加一行元素所占的字节数。二维数组元素的地址可以通过取地址符“&”得到,其一般形式为: &数组名[行标][列标] 设有定义:int a[3][4];,则a代表整个二维数组的首地址,a+i(0≤i≤2)是第i行的首地址。数组元素a[i][j]( 0≤i≤2,≤j≤3)的地址为:&a[i][j]。 根据前面介绍的二维数组的处理方法可知,a是由a[0]、a[1]和a[2]三个元素组成一维数组的数组名,而每个元素a[i](0≤i≤2)又是由四个元素组成的一维数组的数组名,所以由一维数组元素的数组名表示法可以得到下列等价关系: ① *(a+i)与a[i]是等价的,代表一维数组a[i]的首地址,即第i行的首地址。 ② a[i]+j,*(a+i)+j与&a[i][j]是等价的(0≤j≤3),代表数组元素a[i][j]的地址。   null1.指向数组元素的指针变量   指向二维数组元素的指针变量的定义与指向变量的指针变量的定义相同。如: int *p; 定义p为指向整型变量的指针变量,若有下面赋值语句: p=a[0]; 则把元素a[0][0]的地址赋给指针变量p,也就是说,指针变量p指向数组元素a[0][0]。   null2.指向由m个元素组成的一维数组的指针变量 指向数组元素的指针变量加(减)1,是加(减)一个数组元素所占的字节数,指向的元素是原来指向元素的下(上)一个元素。C语言中,也可以定义指向由m个元素组成的一维数组的指针变量,指针变量加(减)1,是加(减)整个一维数组所占的字节数,其定义的一般形式为: 类型标识符 (*指针变量名)[常量表达式] 如: int (*p)[4]; 其含义为:p是一个指针变量,它指向包含4个整型元素的一维数组。p的值加(减)1,是加(减)4个整型数据所占的字节数。 null用这种类型的指针变量可以指向二维数组中的一行,这时的m就是二维数组的列数。若有赋值语句: p=a; 则p+i(0≤i≤2)是一维数组a[i]的首地址。由此可得到下列等价关系: ① *(a+i),*(p+i)和a[i]是等价的,即第i行的首地址。 ② a[i]+j,*(a+i)+j,*(p+i)+j和&a[i][j]是等价的(0≤j≤3),即数组元素a[i][j]的地址。 null5.3.4 二维数组元素的指针法引用 1.利用一维数组的数组名引用二维数组元素 因为a[i]+j和&a[i][j]是等价的,所以*(a[i]+j)和a[i][j]是等价的,其中a[i]是第i行一维数组的数组名。因此,可以用一维数组名引用二维数组中的元素。其引用的一般形式为: *(一维数组名+表达式) 其中,表达式的类型任意,一般为算术表达式,其值为二维数组元素的列标。 如:*(a[1]+2-1)表示二维数组元素a[1][1]。 另外,由于二维数组在内存中是按行连续存储,所以可以把二维数组a看成是数组名为a[0]的一维数组,二维数组元素a[i][j]对应的一维数组元素是:*(a[0]+i*列数+j)。 如:*(a[0]+2*4+1) 表示二维数组元素a[2][1]。 null【例5.11】输出行标为1、列标为2的数组元素和行标为2、 列标为1的数组元素。 main() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; printf("%4d",*(a[1]+2)); printf("%4d\n",*(a[0]+2*4+1)); } 〖运行结果〗 13 19 null2.利用指向二维数组元素的指针变量引用数组元素   用指向二维数组元素的指针变量引用二维数组元素的一般形式为: *(指针变量+表达式) 其中,指针变量是指向二维数组元素的指针变量。表达式的类型任意,一般为算术表达式。若指针变量指向行标和列标都为0的数组元素,则引用的二维数组元素的行标为:(表达式)/列数,列标为:(表达式)%列数;否则引用的二维数组元素的行标为:(指针变量-数组名[0]+表达式)/列数,列标为:(指针变量-数组名[0]+表达式)%列数。 null【例5.12】按行输出二维数组中的元素值。 main() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=&a[0][0];p<&a[0][0]+12;p++) { if((p-a[0])%4==0) printf("\n"); printf("%4d",*p); } } 〖运行结果〗: 1 3 5 7 9 11 13 15 17 19 21 23 null3.利用二维数组名引用数组元素 *(a+i)+j和&a[i][j]等价 *(*(a+i)+j)和a[i][j]等价。 因此,可以利用二维数组的数组名引用二维数组中的元素。其引用的一般形式为: *(*(数组名+表达式1)+表达式2) 其中,表达式1和表达式2的类型任意,一般为算术表达式。表达式1的值是行标,表达式2的值是列标。 null【例5.13】计算4×4阶矩阵的周边元素值之和。 main() { int a[4][4],i,j,sum; sum=0; for(i=0;i<4;i++) for(j=0;j<4;j++) scanf("%d",*(a+i)+j); for(i=0;i<4;i++) for(j=0;j<4;j++) if(i==0||i==3||j==0||j==3) sum+=*(*(a+i)+j); printf("sum=%d\n",sum); } 〖运行结果〗: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sum=102null4.利用指向由m(二维数组列数)个元素组成的一维数组的指针变量引用二维数组元素 由前面的讨论可知,若有定义: int a[3][4],(*p)[4]=a; 则*(p+i)+j和&a[i][j]等价,由此可得,*(*(p+i)+j)和a[i][j]等价。所以,二维数组元素可以用指向由多个元素组成的一维数组的指针变量引用,其一般形式为: *(*(指针变量+表达式1)+表达式2) 其中,指针变量是指向一维数组的指针变量,指向二维数组中的某一行。表达式1和表达式2的类型任意,一般为算术表达式。表达式2的值为要引用的二维数组元素列标。若指针变量指向第一行,则表达式1的值为要引用的二维数组元素行标;否则,要引用的二维数组元素行标为:null 指针变量 - 二维数组名 + 表达式1 若有定义:int a[3][4],(*p)[4]=a+1;,则*(*(p+1)+3-1)表示数组元素a[2][2]。 【例5.14】输出4×4阶矩阵的任意一个元素的值 main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int row,col,(*p)[4]; p=a; scanf("row=%d,col=%d",&row,&col); printf("a[%d][%d]=%d\n",row,col,*(*(p+row)+col)); } 〖运行结果〗: row=2,col=1↙ a[2][1]=10 *(*(p+i)+j)与*(p[i]+j)和p[i][j]等价 null5.4 指针数组 元素为指针类型的数组称为指针数组,也就是说,指针数组中的每个元素都是指针变量。指针数组的定义形式为: 类型标识符 *数组名[常量表达式] 如:int *p[4]; 定义了一个指针数组,数组名为p,它有4个元素,每个元素都是指向整型变量的指针变量。 注意下列三种定义的区别: int p[4]; int (*p)[4]; int *p[4]; 和普通数组一样,指针数组在内存中分配连续的存储空间,指针数组也可以初始化。指针数组元素在使用时与同类型的指针变量相同。 null【例5.15】将5个字符串按由小到大的顺序输出 #define N 5 #include "string.h" main() { char *name[]={"China","Japan","USA","Russia","Canda"}; char *temp; int i,j; for(i=0;i0) {temp=name[i];name[i]=name[j];name[j]=temp;} for(i=0;i
/
本文档为【c语言程序设计 第五章+数组】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索