Appearance
coderzhouyu

数组

初始化

  1. 如果不初始化数组, 数组元素和未初始化的普通变量一样,其中储存的都是垃圾值;
  2. 如果 部分初始化数组,剩余的元素就会被初始化为0。
  3. 初始化数组时省略方括号中的数字,编译器会根据初始化列表中的项数来确定数组的大小
const int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31 };
  1. C99 增加了一个新特性:指定初始化器(designated initializer)
int arr[6] = {[5] = 212}; // 把arr[5]初始化为21
  1. 如果指定初始化器后面有更多的值,那么 后面这些值将被用于初始化指定元素后面的元素。
  2. 如果再次初 始化指定的元素,那么最后的初始化将会取代之前的初始化
#include <stdio.h>
#define MONTHS 12
int main(void)
{
    int days[MONTHS] = { 31, 28, [4] = 31, 30, 31, [1]= 29 };
    int i;
    for (i = 0; i < MONTHS; i++){
        printf("%2d %d\n", i + 1, days[i]);
    }
    return 0;
}

// 1 31
// 2 29
// 3 0
// 4 0
// 5 31
// 6 30
// 7 31
// 651
// 8 0
// 9 0
// 10 0
// 11 0
// 12 0
  1. 如果未指定元素大小,编译器会把数组的大小设置为足够装得下初始化的值.
int stuff[] = {1, [6] = 23};  // 7

赋值

  1. C 不允许把数组作为 一个单元赋给另一个数组,除初始化以外也不允许使用花括号列表的形式赋值。
#define SIZE 5
int main(void)
{
    int oxen[SIZE] = {5,3,2,8}; /* 初始化没问题 */
    int yaks[SIZE];
    yaks = oxen; /* 不允许 */
    yaks[SIZE] = oxen[SIZE]; /* 数组下标越界 */
    yaks[SIZE] = {5,3,2,8}; /* 同样不被允许 */
}

数组和指针

  1. 数组名是数组首元素的地址
flizny == &flizny[0]; // 数组名是该数组首元素的地址
  1. 在C中,指针加1指的是增加一个存储单元
Last Updated 2024/4/15 15:25:47