数体内定义了一个数组b,函数把b数组的启始地址作为函数值返回,企图使指针p指向函数体b数组的开头。
#define N 10 Int *fun(int a[N],int n) { int b[N]; … … Return b; }
Void main() {int w[N] ,*p; … …. P=fun(w,N);
… … }
以上程序涉及几个概念:
1) 函数fun中,形参a可以写成
a[N],a[ ],*a,它是一个指针变量,
在调用fun函数时,系统只为形参a开辟一个存储单元,并把main函数中w数组首地址存进去,使它指向w数组地址。 2) 函数fun的函数体定义了一个
b数组,在调用fun函数时,系统为它开辟一串连续存储单元,它是一个地址常量。
3) 在fun函数执行完毕后,系统
释放a,b所占存储单元,而b的值作为fun函数返回值,指针变量p将不指向任何对象而成为“无向指针。“ 一维数组的应用举例:
1. 编写程序:定义一个含有15个元素的数组,完成以下操作:
(1) 调用C库函数中的随机
函数给所有元素赋以0~50之间的随机数。 (2) 输出数组元素中的值
(3) 按顺序对每隔三个数求
一个和数,并传回主函
数。
(4) 最后输出所求的和值 2. 编写程序,将数组中数,按颠倒的顺序重新存放。
3. 编写程序,查找在已知数组a中
和k相同值的元素的位置,若找
到就输出 数组a中该值和所在的位置,若没有找到输出“没有找到”。
4. 编写程序:删除已知存放n个元
素的数组a中,下标为k的元素。
然后在验证。
5. 用选择法(冒泡法)对数组a中
的数进行排序。
第二节:二维数组
1. 二维数组的定义、引用和赋初值 (一) 二维数组的定义和引用
1. 格式:
类型名 数组名[常量表达式1][常量表达式2]; 定义
数组名[常量表达式1][常量表达式
2]; 引用
2. 图解:(略)
3. 引用:
考点: 1)行列下标下限为0,上限为 n-1 2)一定要使两个下标放在两个括号内。
3) 第m行n列:a[m-1][n-1] (二)二维数组的初始化:
1.正常格式:int a[3][4]={{1, 2, 3, 4 },
{5, 6, 7, 8 },
{9,10,11,12}};
2.缺省:行、列、不带花括号,后自动补0。(只能省略行下标,不能省略列下标)
3.通过赋初值定义二维数组大小。 (三)二维数组遍历方法(双for循环) 例题:通过键盘给2*3的二维数组输入数据,第
第 25 页 共 38 页
一行赋1、2、3、第二行赋10、20、30、然后按行输出此二维数组。
二维数组和指针: (一):二维数组名和指针
1.数组名存放的是内存中该二维数组首地址:即&a[0][0]
如:p=a,即p=&a[0][0],如上图。 (二) 二维数组元素表示方法
1.a[i][j] : 正常格式
2.(*(a+i))[j] : a[i] *(a+i)
a[i][j]
(*(a+i))[j]
3.*(a[i]+j) : a[i] 中存放的是每行的首
地址,可以将一行看成一个一维数组,将a[i]看成一维数组名。
a[i][j]
*(a[i]+j)
4.*(*(a+i)+j) : a[i] *(a+i) *(a[i]+j) *(*(a+i)+j)
5.*(&a[0][0]+4*i+j) : 若有整型数组a[3][4],
可先将二维数组看成一维数组.从首地址开始向上每行元素个数*前面的行数+所在列数,表示当前元素的地址
三:指针数组和行指针 1. 指针数组:
1)
概念:定义一个一维数组,数组中
每一个元素都是一个整型指针变量。
2) 图解:(略)
指针数组中每个指针都指向二维数组的一行,也可以说每个指针存放一行的首地址。 3) 赋值方法(双for循环) for(i=0;i<3;i++) p[i]=a[i]; a[i]是每
行的首地址
4) 指针数组引用指针元素
(1)
p[i]存放一行的首地址与a[i]相同
*(a[i]+j) *(p[i]+j)
a[i][j] p[i][j]
( 2 ) p[i] *(p+i)
*(p[i]+j) *(*(p+i)+j) p[i][j] (*(p+i))[j] 2. 行指针:
1) 概念:定义一个指针变量q,它指
向一个包含两个整型元素的数组。 2) 3)赋初值
若 q=a,则q+1 a+1 a[1] 4)行指针引用数组元素。
(1)因为q=a,所以a的引用方法均适用q(最后一项除外)
(2)*(a[i]+j) *(*(q+i)+j) (*(q+i))[j] q[i][j]
二、二维数组名和指针数组作为实参(考点)
(一)二维数组名作实参
1.当实参为二维数组名时,形参必为
指针,并且这个指针应指向数组,指向数组的指针变量为行指针。形参对应格式,即行指针应为:(*a)[N]
2.行指针也可以表示成a[M][N]
3.行的表达式可以缺省 a[ ][N] (二)指针数组做实参
1.由于指针数组中每个元素均为指
针,因此对应形参应当是指向指针的指针 **a
2.与指针数组表示方式相同*a[M]
3.缺省 *a[ ] 三:典型例题: 1. 编写程序通过调用随机函数给5*6
的二维数组元素赋10—40的整int a[3][2] , (*q)[2];
图解:
第 26 页 共 38 页
数,求出二维数组每行元素的平均值。
2. 3. 4. 编写函数打印杨辉三角形。 找出方阵每列中的最小元素及所在的行号。
编写函数,把任意十进制转换成二5与 int *p[4];定义相同的是:
A) int p[4]; B) int *p; C) int *(p[4]); D) int (*p)[4]; 6.#include
{ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a+2; 进制数。
5. 行列互换(多种方法)
练习一:
1.以下程序输出的结果是________ #include
{int n[2]={0},i,j,k=2; for( i=0;i 2. 以下程序输出的结果是________ main( ) { int i,n[ ]={ 0,0,0,0,0 }; for( i=1;i<=4;i++) { n[i]=n[i-1]*2+1; printf(\ } } 3.以下程序输出的结果是________ main( ) { char a[]=\ printf( \ } 4若有说明:int a[10];下面正确的是________ A) a[10] B)a[3.5] C)a(5) D)a[10-10] printf(“%d\\n”,*p+2);} A 2 B 3 C 4 D 5 7. .#include {int n[3]={0},i,j,k=2; for(i=0;i for(j=0;j A不确定值 B 3 C 2 D 1 8. .#include {int a[ ]={2,4,6,8},*p=a,i; for(i=0;i<4;i++) a[i]=*p++; printf(“%d\\n”,a[2]++); printf(“%d\\n”,a[2]++); } A 45 B 66 C 67 D 68 9. #include {int a[ ]={2,4,6,8},*p=a,i; for(i=0;i<4;i++) a[i]=(*p)++; printf(\printf(\} A 45 B 66 C 67 D 68 10.下面不正确的函数首部: main() {…… int a[50],n; ……. fun(n,&a[9]); ………. } 第 27 页 共 38 页 A void fun( int m,int x[]) B void fun(int s,int h[41]) C void fun(int p,int *s) D void fun(int n,int a) {int t,i,j; for(i=0;i if (a[i] {int c[10]={1,2,3,4,5,6,7,8,9,0},i; fun(c+4,6); for (i=0;i<10;i++) printf(\printf(\} 程序运行的结果是 A)1,2,3,4,5,6,7,8,9,0, B)0,9,8,7,6,5,1,2,3,4, C) 0,9,8,7,6,5,4,3,2,1, D)1,2,3,4,9,8,7,6,5,0, 二:填空 1.有以下程序: main( ) { int x[8]={8,7,6,5,0,0},*s; s=x+3; printf(\}执行结果为___________ 2.下面的程序在数组中同时查找最大值元素的下标和最小元素的下标, 分别存放在main( )函数的变量max和min中; #include void f(int *a,int n,int *max,int *min) { int i; *max=*min=0; for(i=1;i { int a[ ]={5,8,7,6,2,7,3}; int max,min; f( ); printf(\ 第 28 页 共 38 页 11.以下程序中函数f的功能是:当flag为1时,进行有由小到大排序;当flag为0时,进行由大到小排序。 void f(int b[],int n,int flag) {int i,j,t; for(i=0;i for (j=i+1;j if(flag?b[i]>b[j]:b[i] {int a[10]={5,4,3,2,1,6,7,8,9,10},i; f(&a[2],5,0); f(a,5,1); for(i=0;i<10;i++) printf(“%d,”a[i]);} 程序运行后的输出结果是 A)1,2,3,4,5,6,7,8,9,10, B)3,4,5,6,7,2,1,8,9,10, C)5,4,3,2,1,6,7,8,9,10, D)10,9,8,7,6,5,4,3,2,1 12. 程序运行后的输出结果是_______ void f(int b[]) {int i; for(i=2;i<6;i++) b[i]*=2;} main() {int a[10]={1,2,3,4,5,6,7,8,9,10},i; f(a); for(i=0;i<10;i++) printf(“%d,”,a[i]);} 程序运行后的输出结果是 A)1,2,3,4,5,6,7,8,9,10, B)1,2,6,8,10,12,7,8,9,10 C)1,2,3,4,10,12,14,16,9,10, D)1,2,6,8,10,12,14,16,9,10, 13. 有以下程序 #include void fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/