第九章 数组
1.一维数组的定义和一维数组元素的引用
在数组中每个元素只带有一个下标时,称这样的数组为一维数组。
类型名 数组名【整形常量表达式】,……;
例如:int a【8】;
在这里,int是类型名,a【8】就是一维数组说明符,以上语句说明了以下几点:
(1) 定义了一个名为a的一维数组
(2) 方括号中的8规定了a数组含有8个元素,
(3) 类型名int规定了a数组中每个元素都为整形,让每个元素中只能存放整形数
(4) 每个元素只有一个下标,c语言规定每个数组第一个元素的下标总为0(称为数组下标的下界),因此,以上a数组中的最后一个元素的下标应该是7(称为数组下标的下界)
(5) 在内存中开辟如图所示存储单元
在定义数组语句中,可以有多个数组说明符,数组说明符和普通变量名可同时出现在一个类型定义语句中
int c1,c2,carr[81],a[10+2];
由于是一维数组,因此引用数组元素时只带一个下标,引入形式如下:数组名【下标表达式】
(1) 一个数组实质上就是一个变量名,代表内存中的一个存储单元。一个数组占有一串连续的存储单元
(2) 在C语言中,一个数组不能整体引用,例如,不能用x代表x[0]到x[7]这八个元素。C语言中,数组名中存放的是一个地址常量,它代表整个数组的首地址。
一维数组的初始化
int a[8]={1,2,3,4,5,6,7,8};
所赋初值放在等好厚的一对花括号中,数值类型必须与所说明的类型一致,所赋初值之间用逗号隔开,系统按顺序赋值,不可能跳过前面的元素给后面的元素赋值,当所赋初值少于所定义数组的元素个数,将自动给后面的元素补以初值0。可以通过赋值定义数组的大小,如:a[]={1,2,3,4};等同于a[4]={1,2,3,4};
2.一维数组和指针
C语言中,在函数体中或者函数外部定义的数组名可以认为是一个存放地址值的指针变量名,其中的地址值是数组第一个元素的地址,也就是数组所占一串连续的存储单元的起始地址,定义数组时的类型即是此指针变量的基类型。重要的是:这个指针变量中的地址值不可改变,也就是不可以给数组名重新赋值!但可以用对数组名加一个证书的办法,来依次表达该数组中不同元素的地址。
通过数组的首地址引用数组元素:“”是引用地址所在的存储单元的符号,因此对于数组元素a【0】可以用表达式&a【i】或*(a+i)表示。
printf(“%4d”,*(a+i));
printf(“%4d”,a[i]);
通过指针引用一维数组元素:
Float a[10],p,k;
并执行语句:p=a或p=&a[0];后,指针p指向了a数组的首地址。表示数组元素a【i】的表达式:(1)a[i] (2)(s+i) (3)*(p+i) (4)p[i]
3.函数之间对一维数组和数组元素的引用
数组元素作为实参
在调用函数时,数组元素可以作为实参传送给形参,每个数组元素实际上代表内存中的一个存储单元,故和普通变量一样,对应的形参必须是类型相同的变量。数组元素的值可以传送给该变量,在函数中只能对该变量进行操作,而不能直接引用对应的数组元素,更不可能在函数中改变数组元素中的值。
数组名作为实参
数组名也可以作为实参传送,但数组名本身是一个地址值,因此,对应的形参就应当是一个指针变量,此指针变量的基类型必须与数组的类型一致。在函数中,可以通过此指针变量来引用调用函数中对引发的数组元素,从而达到对调用函数中对应的数组元素进行操作而改变其中的值。
4.二维数组的定义和二维数组元素的引用
当数组用每个元素带有两个下标时,称这样的数组为二维数组。
类型名 数组名【常量表达式1】【常量表达式2】,……;
二维数组的初始化:int a[4][3]={{1,2,3},{4,5}};其他的赋值为0.
通过赋初值定义二维数组的大小
可以省略第一个方括号中的常量表达式,不能省略第二个方括号中的常量表达式。
int c[ ][3]={{1,2,3},{1,2},{3,4,5}};等同于int c[3][3]={{1,2,3},{1,2},{3,4,,5}};
5.二维数组和指针
int *p,a[3][4];
在二维数组中,a[0],a[1],a[2]都是一维数组名,同样也代表一个不可变的地址常量,其值依次为二维数组每行第一个元素的地址,其基类型就是数组元素的类型。
二维数组名也是一个地址常量,同样也是一个存放地址常量的指针,其值为二维数组中第一个元素的地址。以上a数组,数组名a 的值与a【0】的值相同,只是其基类型是具有4个整形元素的数组类型,即a+0的值与a[0]的值相同,a+1的值与a[1]的值相同……
二维数组元素的地址
(1) &a[i][j]
(2)a[i]+j
(3)*(a+i)+j
(4)&a[0][0]+4*i+j
(5)a[0]+4*i+j
通过地址引用二维数组元素
(1) a[i][j]
(2)*(a[i]+j)
(3) *(*(a+i)+j)
(4) (*(a+i))[j]
(5) *(&a[0][0]+4*i+j)
建立一个指针数组引用二维数组元素
(1) *(p[i]+j) /*与*(a[i]+j0对应*/
(2) *(*(p+i)+j) /*与*(*(a+i))+j对应*/
(3) (*(p+i))[j] /*与(*(a+i))[j]对应*/
(4) P[i][j] /*与a[i][j]对应*/
通过建立一个行指针引用二维数组元素
int a[3][2],(*prt)[2];
(1) *(prt[i]+j) /*与*(a[i]+j)对应*/
(2) *(*(prt+i)+j) /*与*(*(a+i)+j)对应*/
(3) (*(prt+i))[j] /*与(*(a+i))[j]对应*/
(4) Prt[i][j] /*与a[i][j]对应*/
6.二维数组和指针数组作为实参:
当二维数组名作为实参时,对应的形参必须是一个行指针变量。
指针数组作为实参时实参和形参之间的数据传递:当指针数组名作为实参时,对应的形参应当是一个指向指针的指针
来源:CSDN
作者:Pamper_21
链接:https://blog.csdn.net/Pamper_21/article/details/104130359