C语言入门(十)之数组的定义、初始化、遍历、注意点

版权声明:如果觉得文章对你有用,转载不需要联系作者,但请注明出处 https://blog.csdn.net/jinxin70/article/details/83243576

数组的定义和初始化

先定义再初始化

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;
}

猜你喜欢

转载自blog.csdn.net/jinxin70/article/details/83243576