一:概述
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。
数组中的特定元素可以通过索引访问。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。数组中的特定元素可以通过索引访问,第一个索引值为0。
二:声明数组
在C中要声明一个数组,需要指定元素的类型和元素的数量。
type arrayName [arraySize];
这是一维数组,arraySize必须是一个大于零的整数常量,type可以是任意有效的C数据类型。例如,声明一个类型为double的包含10个元素的数组balance:
double balance[10];
现在balance是一个可用的数组,可以容纳10个类型为double的数字。
三:初始化数组
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
大括号{}之间的值的数目不能大于我们在数组声明时[]中指定的元素数目。若是省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
创建一个数组,它与前一个实例中所创建的数组是完全相同的。
四:访问数组元素
double salary = balance[9];
把数组中第10个元素的值赋给变量salary
实例:
#include <stdio.h>
int main(){
int n[10]; // n是一个包含10个整数的数组
int i,j;
// 初始化数组元素
for(i=0; i<10; i++){
n[i] = i + 100;
}
for(j=0; j<10; j++){
printf("element[%d] = %d \n", j, n[j]);
}
return 0;
}
结果:
┌──(root💀kali)-[~/Desktop/c_test]
└─# vim fangwenshuzu.c
┌──(root💀kali)-[~/Desktop/c_test]
└─# gcc fangwenshuzu.c -o fangwenshuzu
┌──(root💀kali)-[~/Desktop/c_test]
└─# ./fangwenshuzu
element[0] = 100
element[1] = 101
element[2] = 102
element[3] = 103
element[4] = 104
element[5] = 105
element[6] = 106
element[7] = 107
element[8] = 108
element[9] = 109
五:多维数组
C语言支持多维数组,形式如下:
type name[size1][size2]...[sizeN];
例如,下面的声明创建一个三维5.10.4整型数组
int threedim[5][10][4];
二位数组
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:type arrayName [ x ][ y ];
其中,type 可以是任意有效的 C 数据类型,arrayName 是一个有效的 C 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。
因此,数组中的每个元素是使用形式为a[i][j]
的元素名称来标识的,其中a是数组名称,i和j是唯一标识a中每个元素的下标。
初始化二维数组
int a[3][4] = {
{0, 1, 2, 3}, // 初始化索引号为0的行
{4, 5, 6, 7}, // 初始化索引号为1的行
{8, 9, 10, 11} // 初始化索引号为2的行
}
内部嵌套的括号是可选的,下面的初始化与上面是等同的。
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
访问二维数组元素
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。
int val = a[2][3] 获取数组中第3行第4个元素
实例:
#include <stdio.h>
int main(){
// 一个带有5行2列的数组
int a[5][2] = {
{0, 0},
{1, 2},
{2, 4},
{3, 6},
{4, 8}
};
int i, j;
printf("%d \n", a[1][1]); // 1 1 为其索引值
printf("------------- \n");
// 输出数组中每个元素的值
for(i=0; i<5; i++){
for(j=0; j<2; j++){
printf("a[%d][%d] = %d \n", i, j, a[i][j]);
}
}
return 0;
}
结果:
┌──(root💀kali)-[~/Desktop/c_test]
└─# vim erweishuzu.c
┌──(root💀kali)-[~/Desktop/c_test]
└─# gcc erweishuzu.c -o erweishuzu
┌──(root💀kali)-[~/Desktop/c_test]
└─# ./erweishuzu
2
-------------
a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8
六:C传递数组给函数
如果想要在函数中传递一个一维数组作为参数,必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,
因为每种方式都会告诉编译器将要接收一个整型指针。同样地,也可以传递一个多维数组作为形式参数。
方式一:形式参数是一个指针
void myFunction(int *param){
}
方式二:形式参数是一个已定义大小的数组:
void myFunction(int param[10]){
}
方式三:形式参数是一个未定义大小的数组:
void myFunction(int param[]){
}
实例:
现在,让我们来看下面这个函数,它把数组作为参数,同时还传递了另一个参数,根据所传的参数,会返回数组中各元素的平均值:
double getAverage(int arr[], int size){
int i;
double avg;
double sum;
for(i=0; i<size; ++i){
sum += arr[i];
}
avg = sum / size;
return avg;
}
#include <stdio.h>
double getAverage(int arr[], int size); // 函数声明
int main(){
// 带有5个元素的整型数组
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
// 传递一个指向数组的指针作为参数
avg = getAverage(balance, 5);
// 输出返回值
printf("平均值是: %f", avg);
return 0;
}
结果:
┌──(root💀kali)-[~/Desktop/c_test]
└─# vim shuzuhanshu.c
┌──(root💀kali)-[~/Desktop/c_test]
└─# gcc shuzuhanshu.c -o shuzuhanshu
┌──(root💀kali)-[~/Desktop/c_test]
└─# ./shuzuhanshu
平均值是: 214.400000