c同步练习 下载本文

数体内定义了一个数组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 main()

{ int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a+2; 进制数。

5. 行列互换(多种方法)

练习一:

1.以下程序输出的结果是________ #include main( )

{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 main( )

{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 main( )

{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 void main( )

{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;ia[*max]) ________________ if(a[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所指数组元素从大到小排序*/