C语言中数组的初始化

前言

本篇文章介绍C语言中数组的初始化的各种方式

直接初始化

int intArray[2]={1,2};
char charArray[2]={'a','b'};

部分初始化

#include <stdio.h>
int main(void)
{
    int intArray[3]={1,2};
    char charArray[3]={'a','b'};
    for(int i=0;i<3;i++)
    {
        printf("int[%d] = %d\n",i,intArray[i]);
        printf("char[%d] = %c, code = %hhu\n",i,charArray[i],charArray[i]);
    }
    getchar();
    return 0;
}

结果如下:

int[0] = 1
char[0] = a, code = 97
int[1] = 2
char[1] = b, code = 98
int[2] = 0
char[2] =  , code = 0

当初始化列表中的值少于数组元素个数时,编译器会把int数组后面的值初始化为0,字符数组则初始化为空字符

初始化列表数据太多

#include <stdio.h>
int main(void)
{
    int intArray[1]={1,2,3,4};
    char charArray[1]={'a','b','c','d'};
    for(int i=0;i<4;i++)
    {
        printf("int[%d] = %d\n",i,intArray[i]);
        printf("char[%d] = %c, code = %hhu\n",i,charArray[i],charArray[i]);
    }
    getchar();
    return 0;
}

结果如下:

int[0] = 1
char[0] = a, code = 97
int[1] = 0
char[1] =  , code = 1
int[2] = 1876948320
char[2] =  , code = 0
int[3] = 1
char[3] =  , code = 0

当初始化列表中的值大于数组元素个数时,编译器会给出警告或者错误,并舍弃多余的值,如果我们访问数组索引之外的值,得到的数据是内存原本就有的数据

我们在初始化数组时,可以不指定数组大小,编译器会根据初始化列表的长度自动设置数组的大小

指定初始化器

C99提供了指定初始化器的新特性,使用该特性,我们可以指定数组部分值而不用所有值都列出来。看下面的例子:

#include <stdio.h>
int main(void)
{
    int intArray[10]={1,[3]=30,3,[2]=10,4,2,7,8};
    printf("intArray:[");
    for(int i=0;i<10;i++)
    {
        printf("%d",intArray[i]);
        if(i<9)
        {
            printf(", ");
        }
    }
    printf("]\n");
    getchar();
    return 0;
}

运行结果

intArray:[1, 0, 10, 4, 2, 7, 8, 0, 0, 0]

指定初始化器的规则如下:

  • 初始化从左到右依次进行,也就是后面的赋值可以覆盖前面的赋值
  • 如果有一个初始化器赋值,后面的元素依此紧跟着初始化器指定的当前索引往后赋值

变长数组

C99标准可以使用变量来声明数组

int n=0;
printf("input array length.\n");
scanf("%d",&n);
int intArray[n];

这样是可以的,但是C11是可选的,默认情况下,mac是可以的,visual studio不可以,linux用gcc编译器不指定-std的默认情况下也是可以的

多维数组的初始化

多维数组的初始化我们可以看作多组一维数组的初始化,初始化规则是一致的

#include <stdio.h>
int main(void)
{
    int arr[10][10]={
        {1,2,[5]=2,4,6,[1]=0},
        {1},
        [5]={2,[9]=99}
    };
    for(int i = 0;i<10;i++)
    {
        for(int j = 0;j<10;j++)
        {
            printf("%d, ",arr[i][j]);
        }
        printf("\n");
    }
    getchar();
    return 0;
}

运行结果

1, 0, 0, 0, 0, 2, 4, 6, 0, 0, 
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
2, 0, 0, 0, 0, 0, 0, 0, 0, 99, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,

相关推荐

  1. C语言初始化

    2023-12-07 08:46:03       40 阅读
  2. C语言初始化方法大全

    2023-12-07 08:46:03       17 阅读
  3. C++初始化二维几种不同方法

    2023-12-07 08:46:03       12 阅读
  4. C语言和指针关系

    2023-12-07 08:46:03       6 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 08:46:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 08:46:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 08:46:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 08:46:03       20 阅读

热门阅读

  1. 4.1 Docker 容器化和镜像管理

    2023-12-07 08:46:03       36 阅读
  2. *p++和(*p)++的区别

    2023-12-07 08:46:03       33 阅读
  3. 【使用uniapp完成微信小程序的图片下载到本机】

    2023-12-07 08:46:03       42 阅读
  4. Vue实战(十):对数组数据的拆分和分组合并

    2023-12-07 08:46:03       39 阅读
  5. 有基础转Go语言学习笔记(2. 基本数据结构篇)

    2023-12-07 08:46:03       33 阅读
  6. C++的文件读写

    2023-12-07 08:46:03       48 阅读
  7. C++11改进观察者模式

    2023-12-07 08:46:03       33 阅读
  8. [leetcode 差分数组] 拼车 M

    2023-12-07 08:46:03       35 阅读
  9. ElasticSearch 查询优化手段有哪些?

    2023-12-07 08:46:03       31 阅读
  10. 持续集成部署-k8s-高级调度-亲和力

    2023-12-07 08:46:03       28 阅读