C语言学习之路--第五站 数组类型

29 阅读4分钟

数组是可以存储相同类型元素的顺序集合,是由连续的内存位置组成。

例如声明一个数组 runob 。数组中的元素可以通过索引访问,第一个元素对应的是索引0。

  • 数组的声明为: type arrayName [ arraySise ] ;
    • arraySise必须是大于0的整数常量 。
    • type 可以是任意有效的 C 数据类型

例如: double balacnce [ 10 ] ;


声明数组之后便是初始化数组,又有几种方式

  1. double balance [ 5 ] = { 1.3 , 4.2 , 4.4 , 5 , 4 };
    • "{}" 中的值数目不能大于声明中 "[]" 的数目
  2. double balance [ ] = { 1.3 , 4.2 , 4.4 , 5 , 4 };
    • "[]" 中数值可以省略,省略后便是 "{}" 中的值数目
  3. 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]);
};
    

image.png


以上是基础的数组应用,下面开始较为难的数组学习

多维数组

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]);
	}
}

}

image.png

数组参数

下面学习将一个一维数组作为参数。有三种方式声明函数的形式参数,结果是一样的,都是要告诉编译器接受一个整型指针。也可以传递多维数组。

  1. 形式参数为一个指针:void myFunction(int *param){}
  2. 形式参数是一个已定大小的数组void myFunction(int param[10]){}
  3. 形式参数是一个未定大小的数组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;
}

运行结果为下图:

image.png

在测试中发现一个小问题就是函数在返回值为非int或float时会报重定义的错误。经过查询后得知需要在mian函数前需要声明一下,代码如下:

image.png

image.png

可以将数组作为参数传递,自然也可以将数组作为结果传出,但是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);//动态内存释放

使用与静态无异,主要是要释放,其次使用场景多在于接受用户输入,短暂存储后便销毁的场景。

数组类型学习暂时停止,等到学习完指针后在回头来。