C语言数组
定义
- 数组是用来存储一系列相同类型数据的集合
静态数组
- 静态数组内存分配是连续的(即地址连续),最低的地址对应首元素,最高的地址对应末尾元素。在栈内存上分配了固定大小,在运行时这个大小不能改变。在函数执行完以后,系统自动销毁;
int a[5] = {1,2,3,4,5};
或 int a[] = {1,2,3,4,5};//定义时地址分配完毕,数组长度固定
- 定义一个静态数组实例
# include <stdio.h>
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int i;
for (i = 0; i < 5; i++ )
{
printf("%d\n", a[i]);
}
return 0;
}
动态数组
- 动态数组的内存空间是从堆(heap)上分配(即动态分配)的,当程序执行到分配内存语句时,才为其分配存储空间。运行结束后,程序员需要free自行销毁释放分配的空间。
- 定义一个动态数组实例
#include <stdio.h>
#include <stdlib.h> //使用malloc函数需要调用此头文件
int main()
{
int Len; //数组长度
int *array; //数组指针
int i; //数组下标
//获取数组长度
printf("请输入数组长度:");
scanf("%d", &Len);
//动态分配内存空间,如果失败就退出程序
array = (int*)malloc( Len * sizeof(int) );
if(array == null)
{
printf("内存分配失败!\n");
exit(0);
}
//向数组占用的内存写入数据
for(i = 0; i < Len; i++ )
{
array[i] = i + 1;
}
// 遍历数组
for(i = 0; i < Len; i++)
{
printf("%d ", array[i]);
}
printf("\n");
free(array); //释放资源
return 0;
}
一维数组
一维数组的声明
类型名 数组名[常量表达式];
例如:
int a[5]; // 注意为常量表达式 不能是变量
以上就是定义的一个长度为5的整型数组,方括号中的常量表达式为数组的元素个数(即数组长度),a为数组名,同时代表的数组的首元素地址。
一维数组的初始化
-
完全初始化:定义时给所有元素赋值
int a[5] = {1, 2, 3, 4, 5};
-
不完全初始化:定义时只给部分的元素赋值
int a[5] = {1,2}
这种方法只给部分的元素赋值,未赋初值的系统会为默认为其赋初值为0。
注意:定义数组一定要为其赋初值,不能
a[5] = {};
,只有一个大括号,系统会随机为其赋垃圾值,会导致程序出现不必要的错误。大括号中最少要写一个数。比如:
int a[5]={0};
此时系统默认全部赋0值 -
如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。
int a[] = {1,2,3,4,5}; // 不能直接定义 int a[] = {};而不给其赋初值
以上形式自动会根据括号内元素生成长度,省去了我们自己去计算数组长度可能导致错误的情况。
访问数组元素
- 数组元素可以通过数组名称加索引进行访问。元素的索引放在方括号内。
int a[5] = {1,2,3,4,5};
printf ( "%d\n" , a[3]); // 输出的结果为4
- 注意:数组中第一个索引值为 0;长度为n的数组,最后一个元素的索引值为n - 1,若输入a[n]则会报 “数组越界错误”
- 也可以用指针访问数组,例:
#include <stdio.h>
int main()
{
int a[5], i;
printf("输入元素: ");
//循环输入数据
for(i = 0; i < 5; ++i)
scanf("%d", a + i); //数组名代表首元素地址
//遍历数组
printf("数组元素为: \n");
for(i = 0; i < 5; ++i)
printf("%d ", *(a + i));
printf("\n");
return 0;
}
二维数组
- 相当于一个一维数组的列表,声明一个 x 行 y 列的二维整型数组,如
int a[2][3];
相当于两个长度为3的一维数组;理解上可以将其视为x行y列的矩阵,但其内存是连续的。
二维数组的声明
类型名 数组名 [ x ][ y ]; //x表示行标,y表示l列标
- 同样的 a为数组名,同时代表的数组的首元素地址
二维数组的初始化
// 二维数组可以通过在括号内为每行指定值来进行初始化
a[2][3] = {{1,2,3} , {4,5,6}};
//也可以去掉括号,等价
a[2][3] = {1,2,3,4,5,6};
二维数组的访问
- 二维数组中的元素可以通过使用下标索引(行索引和列索引)来访问
#include <stdio.h>
int main()
{
int a[2][3] = {1,2,3,4,5,6};
printf("%d",a[1][2]); //输出结果为6
return 0;
}
- 也可以通过指针访问
#include <stdio.h>
int main()
{
int a[2][3] = { { 1, 2, 3} , {4, 5, 6,} };
int (*p)[3] = a; //定义数组指针执行数组
int i, j;
p = a;
//遍历数组
for (i = 0; i < 2; i++ )
{
for ( j = 0; j < 3; j++ ) printf("%d " , *(*(p+i)+j));
}
printf ("\n");
return 0;
}
多维数组
对于多维数组其实就是维度的推广,用法基本上差不多,学习了指针后,对于多维数组的运用可以应用指针来解决。
有错误欢迎指正,谢谢~