###什么是数组
数组是一组数目固定、类型相同的数据项 数组中的数据称为元素 比如 long numbers[10]; 方括号中的数字定义了要存放在数组中的元素个数,称为数组维度 数组有一个类型,它组合了元素的类型和数组中的元素个数,因此如果两个数组的元素个数、类型相同,这两个数组的类型就相同 可以在数组名称后的方括号内使用索引值,索引值是从0开始的连续整数,例如
numbers[0]
代表numbers数组的第1个元素
###指定数组索引值
有两种方法指定数组索引值,以访问数组中的某个元素 第一种:使用一个简单的整数,明确指定要访问的元素,例如
numbers[4]
第二种:使用计算表达式,计算的结果必须是整数,并且必须在数组中是有效的索引值,例如:numbers[i+3]
如果使用了一个无效的索引值,编译器不会检查出错误,但是执行时会有问题,有可能会提取一个垃圾值,也有比这更糟的,程序可能会覆盖重要的信息,且锁死计算机,需要重启计算机
###使用数组 使用数组计算平均分:
<!-- lang: cpp -->
int main(void) {
int grades[10];
unsigned int count = 10;
long sum = 0L;
float average = 0.0f;
printf("\nEnter the 10 grades:\n");
for(unsigned int i = 0; i < count; ++i) {
printf("%2u> ", i + 1); //提示用户输出10次
scanf("%d",&grades[i]); //遍历10次,每次为数组赋值,并求和
sum += grades[i];
}
average = (float)sum / count; //用求和数除以10次,求出平均数,保留小数点后2为
printf("\nAverage of the ten grades entered is: %.2f\n", average);
return 0;
}
###寻址运算符&
寻址运算符
&
输出其操作数的内存地址,它广泛用于scanf()
函数 把它放在变量名的前面,scanf()
函数就可以利用这个变量的地址,将键盘输入的数据存入变量 只把变量放入函数的参数,函数就可以使用变量存储的值 而把寻址运算符&
放在变量名称前面,函数就可以利用这个变量的地址修改这个变量中存储的值
代码示例:
<!-- lang: cpp -->
#include <stdio.h>
//以下代码的作用是输出一些变量的地址,和所占用的字节数
//得到什么地址值取决于所使用的操作系统及编译器分配内存的方式
int main(void) {
long a = 1L;
long b = 2L;
long c = 3L;
double d = 4.0;
double e = 5.0;
double f = 6.0;
//使用%u显示sizeof生成的值,因为sizeof()生成的结果是无符号的整数
//使用%p输出变量的地址,输出一个内存地址,其值为十六进制
//内存地址一般是32位或64位,地址的大小决定了可以用的最大内存量
printf("A variable of type long occupies %u bytes.", sizeof(long));
printf("\nHere are the addresses of some variables of type long:");
printf("\nThe address of a is: %p The address of b is: %p", &a, &b);
printf("\nThe address of c is: %p", &c);
printf("\n\nA variable of type double occupies %u bytes.", sizeof(double));
printf("\nThe address of d is: %p The address of e is: %p", &d, &e);
printf("\nThe address of f is: %p\n", &f);
return 0;
}
输出结果:
A variable of type long occupies 4 bytes. Here are the addresses of some variables of type long: The address of a is: 0012ff84 The address of b is: 0012ff80 The address of c is: 0012ff7c A variable of type double occupies 8 bytes. The address of d is: 0012ff70 The address of e is: 0012ff68 The address of f is: 0012ff60
###数组的初始化
例如: double values[5] = {1.5,2.5,3.5,4.5,5.5}; 这个语句声明了一个包含5个元素的数组value,values[0]的初值是1.5 初值的个数应该等于数组的维度,如果小于数组的维度,会自动初始化为0 也可以不提供维度,直接初始化数组,由编译器自动推断出元素的个数
###确定数组的大小
使用
sizeof
运算符可以计算出指定类型的变量所占用的字节数sizeof
运算符生成size_t
类型的值,该类型取决于实现代码,一般是无符号的整数类型 如果给输出使用%u
说明符,编译器又把size_t
定义为unsigned类型,编译器就可能发出警告%u
说明符不匹配printf()
函数输出的值,所以使用%zu
会消除该警告消息sizeof
运算符也可以用于数组,如下面的示例
代码示例:
<!-- lang: cpp -->
double values[5] = {1.5,2.5,3.5,4.5,5.5};
//使用sizeof运算符输出上面数组所占的字节数
//sizeof运算符引用于变量时不需要使用括号,但一般还是使用括号
printf("The size of the array, values, is %zu bytes.\n", sizeof values); //8*5 = 40 bytes
//也可以用sizeof运算符计算数组中元素的数目
size_t element_count = sizeof(values) / sizeof(values[0]); // 40 / 8 = 5
//算出个数后,很方便应用于for循环遍历数组
for(unsigned int i = 0; i < element_count; ++i) {
printf("values[%u] = %.2lf\n", i,values[i]);
}
###多维数组
多维数组可以看成是数组的数组,也可以按表格来理解 例如: float numbers[3][5]; 这二维数组维float类型,它拥有3行5列 行数的计算:二维数组总字节数 / 一行的总字节数 = 行数 列数的计算:一行的总字节数 / 某个元素的字节数(也就是某行中某列的元素的字节数)= 列数
代码示例:
<!-- lang: cpp -->
int main(void) {
//初始化二维数组
int numbers[3][2] = {
{1,2},
{3,4},
{5,6}
};
//计算二维数组行数
size_t numbers_row = sizeof(numbers) / sizeof(numbers[0]);
size_t numbers_column = sizeof(numbers[0]) / sizeof(numbers[0][0]);
printf("numbers[0]=%zu\n",sizeof numbers[0]); //输出第一行的字节数
printf("numbers[0][0]=%zu\n", sizeof numbers[0][0]); //输出第第一行第一列的字节数
printf("row=%zu\n", numbers_row); //输出行数
printf("column=%zu\n", numbers_column); //输出列数
for(unsigned int i = 0; i < numbers_row; ++i) {
for(unsigned int j = 0; j < numbers_column; ++j){
printf("numbers[%u][%u] = %d\t", i,j,numbers[i][j]); //输出某行中的列
}
printf("\n"); //一行结束,换行
}
return 0;
}