一维数组
声明数组时要遵循以下规则: (1)数组名的命名规则和变量名的相同,即遵循标识符命名规则。 (2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的 个数,即数组长度。 (3)常量表达式中可以包含常量和符号常量,但不能包含变量。也就是说,C 语言不允许 对数组的大小做动态定义,即数组的大小不依赖于程序运行过程中变量的值
#include <stdio.h>
int main()
{
int a[20];
// 数据个数已经确定,可以不指定数组长度
int b[] = {1, 2, 3, 4, 5, 6};
// 可以只给一部分元素赋值
int c[20] = {0, 1, 2, 3, 4, 5};
return 0;
}
数组的访问越界
编译器并不检查程序对数组下标的引用是否在数组的合法范围内。
#include <stdio.h>
void access_out_of_bounds();
int main()
{
access_out_of_bounds();
return 0;
}
void access_out_of_bounds()
{
int a[5] = {1, 2, 3, 4, 5};
int j = 20;
int i = 10;
a[5] = 6; // 越界访问
a[6] = 7; // 越界访问会造成数据异常
printf("i=%d\n", i); // i 发生改变
}
数组的传递
一维数组在传递时,其长度是传递不过去的,所以我们通过 len 来传递数组中的元素个数。实际数组名中存储的是数组的首地址,在调用函数传递时,是将数组的首地址给了变量 b(其实变量 b 是指针类型),在 b[]的方括号中填写任何数字都是没有意义的。
#include <stdio.h>
void array_transmit();
void print(int b[], int len);
int main()
{
array_transmit();
return 0;
}
void array_transmit()
{
int a[5] = {1, 2, 3, 4, 5};
print(a, 5);
printf("a[4]=%d\n", a[4]);
}
// 子函数的形参接收到是数组的起始地址,因此不能把数组的长度传递给子函数
// C 语言的函数调用方式是值传递
void print(int b[], int len)
{
int i;
for (i = 0; i < len; i++)
{
printf("%3d", b[i]);
}
b[4] = 20; // 在子函数中修改数组元素
printf("\n");
}