数组的定义和初始化
先定义再初始化
int scores[5];
注意: 不建议使用变量定义数组, 如果使用了变量定义数组, 作为数组的元素个数, 不初始化的情况下是随机值, 如果初始化会直接报错
int num2 = 10;
int scores4[num2] = {11, 12};
依次将{}中的每一个值赋值给数组中的每一个元素
并且从0开始赋值
也称之为数组的初始化(完全初始化)
int scores[5] = {99,88,77,66,100};
部分初始化,对应的内存没有初始化,默认就是0值
int scores1[3] = {11, 22};
注意:没有初始化,使用的时候,编译期不会报错,但是数据是随机值,所以数组一定要初始化后使用。
注意: 如果定义的同时进行初始化, 那么元素的个数可以省略
int scores5[] = {1, 3};
如果定义数组时没有进行初始化, 那么不能省略元素个数
int scores6[];//只是定义,而不初始化,必须指定元素个数,否则编译期会报错
可以通过[索引] = 的方式, 给指定索引的元素赋值。
int socres7[101] = {[99] = 1, [100] = 3};
只能在定义的同时利用{}进行初始化, 如果是先定义那么就不能使用{}进行初始化。如果先定义那么就不能再进行整体赋值, 只能单个赋值。
int scores8[3];
scores8 = {1 , 4, 19};//编译不通过,定以后,必须逐个初始化
scores8[0] = 1;
数组的遍历
在遍历数组的时候, 尽量不要把遍历的次数写死,遍历多少次应该由数组来决定, 也就是说遍历多少次应该通过数组计算得出。
int scores[6] = {1, 23, 44, 66, 71, 88, 99 , 2};
printf("scores = %lu\n", sizeof(scores)); // 计算出数组占用的总字节数
printf("scores[0] = %lu\n", sizeof(scores[0])); // 计算出数组中某一个元素占用的字节数
printf("一个数组有多少个元素 : %lu\n", sizeof(scores) / sizeof(scores[0]));
数组遍历的写法:
// 动态计算数组的元素个数
int length = sizeof(scores) / sizeof(scores[0]);
for (int i = 0; i < length; i++) {
printf("scores[%i] = %i\n", i,scores[i]);
}
数组注意点:
数组的存储和变量有点不一样, 数组存储元素, 是从所占用的低字节开始存储
#include <stdio.h>
int main(int argc, const char * argv[]) {
// 变量在内存中的存储
// 由于变量的内存寻址是从大到小, 所以存储数据时会从高字节开始存储
int num = 10; // 0000 0000 0000 0000 0000 0000 0000 1010
// 注意: 数组的存储和变量有点不一样, 数组存储元素, 是从所占用的低字节开始存储
char charValues[4] = {'l', 'u', 'c', 'k'};
/*
charValues[0] = 0x7fff5fbff7c8
charValues[1] = 0x7fff5fbff7c9
charValues[2] = 0x7fff5fbff7ca
charValues[3] = 0x7fff5fbff7cb
*/
printf("charValues[0] = %p\n", &charValues[0]);
printf("charValues[1] = %p\n", &charValues[1]);
printf("charValues[2] = %p\n", &charValues[2]);
printf("charValues[3] = %p\n", &charValues[3]);
// &charValues == &charValues[0] == charValues
printf("&charValues = %p\n", &charValues);
// 其实数组名就是数组的地址
printf("charValues = %p\n", charValues);
// 00000000 00000000 00000000 00000101
// 00000000 00000000 00000000 00000110
int nums[2] = {5, 6};
return 0;
}
数组的地址就是数组首个元素的地址,也是数组名的地址。
C语言没有数组越界检查,如果访问超过定义的数组长度,结果不可预期,有可能报错,有可能可以访问但访问到的是脏数据。
练习题
#include <stdio.h>
int main(int argc, const char * argv[]) {
// 从键盘录入当天出售BTC的价格并计算出售的BTC的总价和平均价(比如说一天出售了3个比特币)
// 1.接收数据
/*
printf("请输入第1个比特币的价格\n");
int value1 = -1;
scanf("%i", &value1);
printf("请输入第2个比特币的价格\n");
int value2 = -1;
scanf("%i", &value2);
printf("请输入第3个比特币的价格\n");
int value3 = -1;
scanf("%i", &value3);
*/
// int value3 = -1;
/*
int sum = 0;
int value = -1;
for (int i = 0; i < 3; i++) {
printf("请输入第3个比特币的价格\n");
scanf("%i", &value);
sum += value;
}
*/
// 1.1定义数组保存每个比特币的价格
int values[4] = {-1};
// 1.2动态计算数组的元素个数
int length = sizeof(values) / sizeof(values[0]);
// 1.3定义变量保存总和
int sum = 0;
for (int i = 0; i < length; i++) {
printf("请输入第%i个比特币的价格\n", i + 1);
scanf("%i", &values[i]);
sum += values[i];
}
/*
// 2.计算总和
// int sum = value1 + value2 + value3;
int sum = 0;
for (int i = 0; i < length; i++) {
sum += values[i];
}
*/
// 3.计算平局值
int average = sum / length;
// 4.输出结果
printf("sum = %i, average = %i\n", sum, average);
return 0;
}