• c语言学习笔记 —— 数组


    1. 数组的内存分配原理。

    数组定义  int a[3] = {1,3,11};

    如下写法是错误的:

    int number;

    int a[number] = {1,7,9};

    原因是:没有定长的数组初始化的时候,由于计算机不知道该分配多少空间给它,因此初始化会失败!

    如下的写法虽然也可以运行,但是结果不是我们期望的。

    int a[2] = {3,7};

    int b[3] = {22,33,18};

    b[3] = 99;

    printf("b[3] is : %i ", b[3]);  //这里输出的结果是什么? b只有3个元素,而我们这里输出第四个元素。结果输出还是 99

    再来看

    printf("a[0] is : %i ", a[0]); //这里输出的结果是什么,猜猜看?

    上面的输出结果我们发现a[3]变成了99,这是为什么呢?

    因为数组作为一个变量在内存中也是从高到低存储的,但是数组元素却是按照从低到高排列在该数组所占的存储空间中。所以上面的b[3]挤占了 数组a中的第一个元素。如下图所示:

    地址      数组变量     数组元素地址     数组元素值

    0ffc19

    0ffc20

    0ffc21   数组b       b[0]                88

    0ffc22                 b[1]                 33

    0ffc23                 b[2]                  22

    0ffc24   数组a       a[1]                 7(b[3]的修改导致这里被修改)

    0ffc25                  a[0]                 3

    2. 参数传递给形参为数组的函数的时候,传递的是数组的地址,因此数组的元素个数是可以省略的。

    因此,主要是看形参

    3. 数组作为形参会自动转换为指针,而指针在64位系统中占8个字节,也就是说无法在函数中通过传入的形参数组来计算数组的长度,必须将数组长度作为单独的参数进行传递。

    例如

    int a[3] = {1,2,3};
    void printArray(arr[]){ int len = sizeof(arr[]) / sizeof(arr[0]); for (int i = 0; i < len; i ++){   printf("The nth eleme is : %i ", arr[i]); } }

    上面的代码打印后将无法输出正确的结果。 因为 sizeof(arr[])将永远等于8。

  • 相关阅读:
    向局域网共享文件夹 写文件(示例)
    安装adb之后出现 找不到设备的情况
    .net 下发送calendar
    解决api 跨域 webconfig添加节点
    String类为什么是不可变的
    Sql
    2020职业规划
    摘录
    Docker
    软件测试工程师的职责是什么
  • 原文地址:https://www.cnblogs.com/aleafo/p/5379994.html
Copyright © 2020-2023  润新知