C语言-数组

本文最后更新于:1 年前

数组名

  • 求数组长度,只能使用数组名,不能使用数组指针

    C语言标准规定,当数组名作为数组定义的标识符(也就是定义或声明数组时)、sizeof 或 & 的操作数时,它才表示整个数组本身,在其他的表达式中,数组名会被转换为指向第 0 个元素的指针(地址)。

    对数组名进行&操作,并不是取其地址,而是得到了指向整个数组的指针。也就是说,arr与&arr指向的是同一个地址,但是他们的类型不一样。arr相当于&arr[0],类型是int *,而&arr是指向整个数组的指针,类型是int (*)[5]

  • 数组名不可以自增(可以加减)

    1
    2
    int a[10]={0};
    a++; //错误,数组名是指针型常量

初始化

  • 数组只给部分元素赋值时,剩余元素会自动初始化为0

    int nums[10] = {0}; 相当于只给第一个元素赋0,剩余元素自动初始化为0了

    对于short、int、long,就是整数 0;

    对于char,就是字符 ‘\0’;

    对于float、double,就是小数 0.0

  • 如给全部元素赋值,那么在定义数组时可以不给出数组长度int nums[] = {1,2,3};

  • C99标准后可以指定下标进行初始化

    1
    2
    int a[10]={ [2]=12 };
    int a[]={ [9]=11 }; //C99中长度可以自动推算

二维数组

  • 二维数组的初始化可以按行分段赋值,也可按行连续赋值。

int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};

  • 如果对全部元素赋值,那么第一维的长度可以不给出

int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

  • 一个二维数组也可以分解为多个一维数组

二维数组a[3][4]可分解为三个一维数组,它们的数组名分别为 a[0]、a[1]、a[2]

变长数组

  • 普通数组(固定长度的数组)是在编译期间分配内存的,而变长数组是在运行期间分配内存的。(C99后才能使用变长数组)
  • 变长数组仍是静态数组(一旦定义长度不能变化)

数组下标

  • 对数组的引用 a[i] 在编译时总是被编译器改写成*(a+i)的形式,因此两者是一样的
  • 取下标操作符[ ]是建立在指针的基础上,它的作用是使一个指针和一个整数相加,产生出一个新的指针,然后从这个新指针(新地址)上取得数据

a[3] 等价于 *(a + 3),3[a] 等价于 *(3 + a)

  • 使用下标时,编译器会自动把下标的步长调整到数组元素的大小