一、一维数组
1.1 数组定义
数组:一组具有相同数据类型的数据的有序集合。
一维数组的定义格式
类型说明符 数组名 [常量表达式]
例如:
int a[5];
定义一个整型数组,数组名为a,它有10个元素。
数组声明需要遵循以下原则:
- 数组名的命名规则和变量名的相同,即标识符命名规则。
- 在定义数组是,需要指定数组元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。
- 常量表达式中可以包含常量和符号常量,但是不能包含变量。说白了,C语言不允许对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值。
1.2 一维数组的赋值、访问、数组传递
-
在定义数组时对数组元素赋初值
int a[5] = {1,2,3,4,5};
-
给数组中一部分元素赋值
int a[5] = {1,2,3};
-
如果要使一个数组中全部元素的值为0,可以写为
int a[5] = {0};
-
在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组的长度
int a[] = {5,6,7,8,9};
例子如下:掌握数组的赋值、访问、数组传递
#include<stdio.h>
#include<stdlib.h>
void print(int b[], int len)
{
int i;
for ( i = 0; i < len; i++)
{
printf("%3d", b[i]);
}
b[4] = 20;//在子函数中修改数组元素
printf('\n');
}
#define N 5
int main()
{
int j = 10;
int a[5] = { 1,2,3,4,5 };//定义数组时,长度必须固定
int i = 3;
a[5] = 20;//访问越界
a[6] = 21;
a[7] = 22;//越界访问会造成数据异常
print(a, 5);
printf("a[4]=%d\n", a[4]);//a[4]发生改变
system("pause");
return 0;
}
1.3 栈空间和数组
Windows操作系统中单个函数的栈空间大小是1MB,Linux操作系统中单个函数的栈空间大小时10MB(Linux操作系统下可以修改)。
例1. Windows中单个函数栈空间上限
#include<stdio.h>
#include<stdlib.h>
#define N 250000
int main()
{
int arr[N] = { 0 };
system("pause");
return 0;
}
代码执行结果如下:
例2. Windows中单个函数栈空间访问越界
#include<stdio.h>
#include<stdlib.h>
#define N 260000 //超出单个函数的栈空间限制
int main()
{
int arr[N] = { 0 };
system("pause");
return 0;
}
代码执行结果如下:
二、二维数组
2.1 二维数组的定义与引用
二维数组定义的一般形式如下:
类型说明符 数组名[常量表达式][常量表达式]
例如:
float a[3][4];
可以将二维数组视为一种特殊的一维数组:一个数组中的元素类型是一维数组的一维数组。
例如,可以把二维数组a[3][4]视为一个一维数组,它有3个元素a[0]、a[1]和a[2],每个元素又是一个包含4个元素的一维数组,如下图所示。
下图显示了二维数组a[3][4]中每个元素时的顺序。
2.2 二维数组的初始化及传递
-
分行给二维数组赋初值
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
-
将所有数据写在要给花括号内,按数组排列的顺序对各元素赋初值
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
-
对部分数组元素赋初值
int a[3][4] = {{1},{5},{9}};
-
如果对全部元素赋初值,那么定义数组时可以不指定第一维的长度,但是要指定第二维的长度。例如,
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
等价于
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
例子如下:掌握二维数组的赋值、访问、数组传递
#include<stdio.h>
#include<stdlib.h>
//二维数组的首地址,赋值给b
//行不能传递过去,列一定要写
void print(int b[][4], int row)
{
int i, j;
for ( i = 0; i < row; i++)//外层循环为行
{
for (j = 0; j < sizeof(b[0]) / sizeof(int); j++)//内层循环为列
{
printf("%3d", b[i][j]);
}
printf('\n');
}
}
//二维数组的存储结构
//二维数组的传递
int main()
{
int a[3][4] = { 1,3,5,7,2,4,6,8,9,11,13,15 };
float b[4] = { 1,2,3,4 };
int c[3][4] = { {1},{5,9} };//可以只对部分元素进行初始化
print(a, 3);
printf("a[2][3]=%d\n", a[2][3]);//打印最后面的一个元素
system("pause");
return 0;
}
执行结果如下: