数组是可以存储相同类型元素的顺序集合,是由连续的内存位置组成。
例如声明一个数组 runob 。数组中的元素可以通过索引访问,第一个元素对应的是索引0。
- 数组的声明为: type arrayName [ arraySise ] ;
- arraySise必须是大于0的整数常量 。
- type 可以是任意有效的 C 数据类型
例如: double balacnce [ 10 ] ;
声明数组之后便是初始化数组,又有几种方式
double balance [ 5 ] = { 1.3 , 4.2 , 4.4 , 5 , 4 };
- "{}" 中的值数目不能大于声明中 "[]" 的数目
double balance [ ] = { 1.3 , 4.2 , 4.4 , 5 , 4 };
- "[]" 中数值可以省略,省略后便是 "{}" 中的值数目
balance[4] = 60.0;
- 此时是索引为4的元素赋值
初始化之后自然而然就到了访问的问题。可以通过数组名称加索引进行访问,元素索引是放在方括号内的。
例如:double salary = blance[9];
数组长度可以使用 sizeof 运算符获取。 例如 : lenth = sizeof(balance) / sizeof(balance[0]);
另外需要知道的就是C语言中未初始化的数组其值是随机的。
以上是数组的基本使用方法。下面我们写一个方法进行简单的实验。
int array_demo()
{
int array1[5] = { 1, 2, 3, 5, 6 };
double array2[] = { 1, 3, 4, 6 };
int array3[5];
int a = array1[4];
printf("数据展示:a:%d\n", a);
printf("数据展示:b:%lf\n", array2[0]);
for (int a = 0; a < 5; a++)
{
printf("循环数据展示第%d个元素 = %d \n", a + 1, array1[a]);
}
int b = sizeof(array1);
int c = sizeof(array1[0]);
printf("数组长度=%d\n", sizeof(array1));
printf("数组长度=%d\n", b);
printf("数组长度=%d\n", c);
printf("数组长度=%d\n", b / c);
//array3[2] = 4;
for (a = 0; a < 5; a++)
{
printf("%d\n", array3[a]);
};
以上是基础的数组应用,下面开始较为难的数组学习
多维数组
C语言支持多维数组,一般声明形式:type name[size1][size2]...[sizeN];
其他操作类似,进行一个二位数组的初始化示例:
int a[3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10,11}
};
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
上述两种方式结果是一样的。我们进行一个小测试。
int arrays_demo()
{
int array1[2][3] = {
{1,2,3},
{4,5,6}
};
int array2[2][3] = { 1,2,3,4,5,6 };
for ( int a = 0 ; a < 2; a++)
{
for (int b = 0; b < 3; b++)
{
printf("第%d层,第%d个元素:%d\n", a , b , array1[a][b]);
}
}
}
数组参数
下面学习将一个一维数组作为参数。有三种方式声明函数的形式参数,结果是一样的,都是要告诉编译器接受一个整型指针。也可以传递多维数组。
- 形式参数为一个指针:
void myFunction(int *param){}
- 形式参数是一个已定大小的数组
void myFunction(int param[10]){}
- 形式参数是一个未定大小的数组
void myFunction(int param[]){}
下面写一个方法进行实验,参考菜鸟教程中获得数组平均值方法。
double getAverage(int *arr, int size)
{
double avg;
double sum = 0;
for (int a = 0; a < size; a++)
{
sum += arr[a];
}
avg = sum / size;
return avg;
}
运行结果为下图:
在测试中发现一个小问题就是函数在返回值为非int或float时会报重定义的错误。经过查询后得知需要在mian函数前需要声明一下,代码如下:
可以将数组作为参数传递,自然也可以将数组作为结果传出,但是C语言中不允许返回一个完整的数组,因此需要借助指针。所以此部分内容放在学完指针之后再返回进行学习。伴随着这一部分内容的还有指向数组的指针。
数组类型
C语言中数组可以分为两种类型,静态数组与动态数组。
- 静态数组编译时分配内存,大小固定
- 动态数组运行时手动分配内存,大小可变
- 动态数组生命周期与作用域相关,动态周期由程序员控制
- 在使用动态数组时,需要注意合理分配和释放内存,避免内存泄漏以及无效内存问题
静态数组即上述所说内容。另外了解数组长度计算原理,通过sizeof(array)
获取整个数组占用字节数,通过sizeof(array[0])
获取单个元素的字节数,相除获得数组长度。
下面主要了解动态内存:
- 动态数组在运行时通过动态内存分配函数手动分配,并存储在堆上,需要用 malloc 和 calloc 等申请内存,并使用 free 函数来释放内存
- 动态函数可以在运行时调整大小,可以使用 realloc 函数来重新分配内存,并改变数组大小
声明函数:
int size = 5 ;//数组长度
int *dynamicArray = (int *)malloc(size * sizeof(int));//动态数组内存分配
int *dynamicrray = malloc(size * sizeof(int));//动态数组内存分配
//使用动态数组
free(dynamicArray);//动态内存释放
使用与静态无异,主要是要释放,其次使用场景多在于接受用户输入,短暂存储后便销毁的场景。
数组类型学习暂时停止,等到学习完指针后在回头来。