在引用数组元素时,数组元素的下标表达式必须是整数,下标表达式下限为0,系统并不自动检测下标是否越界,因此编程时要注意。 4.举例:
编写程序,定义一个含有30个元素的int类型数组。依次给数组元素赋奇数1,3,5„„;然后按每行十个顺序输出,最后按每行十个逆序输出。 main() {int a[30],i,j;
for(i=0,j=1;i<30;i++,j+=2) a[i]=j; for(i=0;i<30;i++)
{if(i%10==0) printf(“\\n”); printf(“%d”,a[i]); }
for(i=30-1;i>=0;i--) {printf(“%d”,a[i]); If(i%10==0) printf(“\\n”); } }
第二节 一维数组和指针 1.一维数组和数组元素的地址 1)数组和指针的比较记忆
(1)指针变量的地址值(每个变量的地址就是该变量第一个字节的地址)
数组名的地址值:就是该数组的第一个元素的地址。 (2)指针变量有基类型,相当于数组的类型名。
(3)指针变量的地址值是不可变的,因此不可以给数组名重新赋值。
例:p=&a;(a地址不可变,p的值可变) int a[10]; 语句a=&x;或a++;都是非法的,因为不能给a重新赋值,一旦定义,a永远指向a数组的首地址。
2)虽然不可以改变a中的内容,但可以对数组名加一个整数的办法来表达数组中不同元素的地址。int a[10],*p,x; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
即a是地址常量 a &a[0]
a+1 &a[1] a+2 &a[2] 1个单位代表一个存储单元,而非简单的+1-1操作 a+1*d 例:(k为int) for(k=0;k<10;k++) p=a+k;
for(k=0;k<10;k++) scanf(“%d”,a+k); 语句p=&a[0], p=a指向a数组首地址 以下语句等价:for(p=a,k=0;k<10;k++) p++;
for(p=a,k=0;k<10;k++) {scanf(“%d”,p);p++;} for(p=a,k=0;k<10;k++) scanf(“%d”,p++); for(p=a;p-a<10;p++) scanf(“%d”,p); * 求当前地址的内容 &求当前内容的地址
象乘法和除法一样,同时出现相互抵销。
2.通过数组首地址、指针、带下标的指针引用一维数组元素。
1)*&a[i] *(a+i) (p=a;p=&a[0] *(p+i) a[i] *(a+i) p[i] *(p+i)
[]不仅可以表示数组元素的下标,还可以作为运算符,变址运算符 数组a 10 p
以上是数组元素a[i]的表示方法,一对方括号不仅表示数组元素的记号,也是一种运算符。 &a[i] a+i p+i a[i] p[i]
20 30 40 50 60 *(p--) a[i--] *--p a[--i]
2)a的区别:a是不可变的,p中的地址值却是可变的,因此: a++、a=p、p=&a 非法 p++、p=a;p=&a[i] 合法 3)逐个输出a数组中元素的值
for(k=0;k<10;k++) printf(“%4d”,*(a+k)); for(k=0;k<10;k++) printf(“%4d”,a[k]); for(p=a,k=0;k<10;k++) printf”%4d”,*(p+k)); for(k=0;k<10;k++) printf(“%4d”,p[k]);
第三节 函数之间对一维数组和数组元素的引用及一维数组实例
1、数组元素作实参
在调用函数时,数组元素可以作为实参传递给形参,每个数组元素实际上代表内存中的一个存储单元,和普通变量一样,对应的形参必须是类型相同的变量。 2、数组名作实参
数组元素的值,可以传送给该变量,在函数中只能对该变量进行操作,而不能直接引用对应数组元素。数组名也可以作为实参传送,但数组名本身是一个地址值,因此,对应的形参就应当是一个指针变量,来引用调用函数中对应的数组元素,从而达到对调用函数中对应数组元素进行操作。 a[i]
*(a+i) p[i] *(p+i)
例题:编写程序,通过函数给数组输入若干大于等于0的整数,用负数作为输入结束的标志;调用函数输出该数组中数据。
#define M 100 int arrin(int *a) {int i=0;
scanf(“%d”,&a[i]); while(a[i]>=0) {i++;
scanf(“%d”,&a[i]); } return i; }
arrout(int *a,int n) {int i;
for(i=0;i 1)当数组名作为实参时,对应的形参可以为: (1)arrin(int *a) (2) arrin(int a[]) (3)arrin(int a[M]) 上机、笔试必考,形参数组与定义数组不一样,并不开辟存储单元 2)此处*(a+i) a[i] 此中,a指向a[M]数组的首地址的指针,a[i]只是与a[M]形式上相似,但在被调用函数中并未主形参开辟一串存储单元。 3.数组元素的地址作为实参 当数组元素的地址作为实参时,因为是地址值,所以对应的形参也应是基类型相同的指针变量。 例题:编写出函数,对具有10个元素的char类型数组,从下标为4的元素开始,全部设置星号“*”,保留前四个元素中内容不变。 fun(char *b,int n) {int i; for(i=0;i for(i=0;i 数组名作实参 形参 a *a a[] a[10] 数组元素地址作实参 形参 &a[4] *b b[] b[10] 4.函数的指针形参与函数体中的数组的区别 例:以下程序,形参a指向w数组,函数体内定义了一个数组b,函数把b数组的起始地址作为函数值返回,企图使指针p指向函数体内b数组的开头。 #define N 10 main() {int w[N],*p; „„ p=fun(w,N); „„ } int *fun(int a[N],int n) {int b[N]; „„ return b; } 数组w 数组b 以上程序涉及几个概念: 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.已知数组中的值在0-9的范围内,统计每个整数的个数 4.已知存放在a数组中的数不相重,在a数组中查找和x值相同的元素位置。若找到,输出该值和该值在a数组中的位置;若没找到,输出相应的信息。 5.W数组中存放n个数据,编写函数删除下标为k的元素中值 6.用选择法用数组中的数进行排序 (按从小到大的顺序) 第五节 二维数组和指针及二维数组程序举例 一、 二维数组和指针 (一)二维数组名和指针 1、数组名存放的是内存中该二维数组首地址,即&a[0][0]。int a[2][3] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 2、若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],可先将二维数组 看成一维数组,从首地址开始,加上每行元素个数*行数+所在列数 a[2][3] *(&a[0][0]+4*i+j) (三)指针数组和行指针 1.指针数组 1)概念:定义一个一维数组,数组中的每一个元素都是一 个整型指针变量。 int a[2][3],*p[3]; 2)图解 p[0] 指针数组中每个指针都指向二维数组的一行,也可以说每个 指针存放一行的首地址。 3)赋值方法(双for循环) P[1] p[2] for(i=0;i<3;i++) p[i]=a[i] a[i]中存放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,它指向一个包含两个整形元 素的数组。 int a[3][2],(*q)[2]; 2)图解: q 3)赋初值 若q=a,则q+1 a+1 a[1] (1)因为q=a,所以a的引用方法均适用于q(最后一项除外) (2)*(q[i]+j) *(*(q+i)+j) (*(q+i))[j] 最后一项除 二、二维数组名和指针数组作为实参(考点) (一)二维数组名作为实参 1.当实参为二维数组名时,形参必为指针,并且这个指针应指向数组,指向数组的指针变量为行指针,形参对应格式,即行指针应为 (*a)[N] 2.行指针也可以表示成a[M][N] 3.行的表达式可缺省a[ ][N] (*a)[N] a[M][N] a[ ][N] (二)、指针数组作实参 1.由于指针数组中每个元素均为指针,因此对应形参应当是指向指针的指针。 **a 2.指针数组表示方式相同 *a[M] 3.缺省*a[ ] **a *a[M] *a[ ] 三、典型例题 1.编写出程序通过调用随机数函数给5*6的二维数组元素赋10-40的整数,求出二维数组每行元素平均值。 2.编写程序,要求打印出以下形式的杨辉三角形。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 3.找出方阵中每列中的最小元素及所在行号。 4.编写函数,把任意十进制转换成二进制数。 5.行列互换(二种方法)。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- kqyc.cn 版权所有 赣ICP备2024042808号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务