有一回,小易同学对我说:“你学过编程吗”,我略略点一点头。他说,“学过编程,我便考一考你,在使用数组之前,应不应该初始化数组?

我暗想,这么简单的问题,也配考我么?不只是数组,在使用任何变量之前,都应该对变量进行初始化,这是一个编程的好习惯,可以有效避免许多由于垃圾值导致的bug。于是我回过脸去,不再理会。

小易同学等了许久也不见我回答,很诚恳的说道,“不知道罢?我教给你,记着!......数组的初始化有4种写法——”

目录

1.初始化参数列表

2.使用memset函数初始化(只建议用于字符数组)

3.指定初始化器(gcc支持)

4.使用for循环初始化

5.总结


1.初始化参数列表

全部初始化为0:

int a[10]={0};
char str[10]="\0";    //等价于char str[10]={0};

初始化为其他值:

int a[10]={0,1,2,3,4,5,6,7,8,9};
char str[10]="Hello";    //也可以写成char str[10]={'H','e','l','l','o','\0'}

如果初始化列表包含数组a的所有元素,可以省略数组的长度:

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

多维数组在计算机中也是线性存储的,因此下面两种写法等价:

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

注意,如果你想把数组元素全部初始化为一个非零值(比如1),不能使用int a[10]={1}这种方式。int a[10]={1}只会把a[0]初始化为1,而把其他元素初始化为0(C99标准下)。

2.使用memset函数初始化(只建议用于字符数组)

memset函数的定义包含在头文件string.h中,其函数原型如下:

void *memset(void *s, int c, unsigned long n);

//memset函数:将s指向的内存位置后面n个字节的存储空间替换为c

#include<stdio.h>
#include<string.h>
int main(){int i=0;char a[10];memset(a,'a',sizeof(a));//初始化for(i=0;i<10;i++)printf("%c ",a[i]);printf("\n");return 0;
}

注意memset通常只用于用于字符数组的初始化,因为memset替换内存空间的值时是以字节为单位的(char类型恰好只占1字节,而int类型一般占4字节)

如果你用memset来初始化int数组就会这样:

因为(00000001 00000001 00000001 00000001)B=(16843009)D

如果使用memset初始化int数组,初始值只能设为0或-1

#include<stdio.h>
#include<string.h>
int main(){int i=0;int a[10];memset(a,-1,sizeof(a));//全部替换为-1for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");memset(a,0,sizeof(a));//全部替换为0for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;
}

因为(00000000 00000000 00000000 00000000)B=(0)D,

(11111111 11111111 11111111 11111111)B=(-1)D

3.指定初始化器(gcc支持)

指定初始化器是C99标准新增的一个特性,形如int a[10]={[0 ... 9]=1}或int a[10]={[1]=1,[2]=2,[9]=9},可以初始化指定的数组元素。

经笔者测试,只有gcc编译器(Codeblocks的.c文件就是用gcc编译的)支持该特性。vc++6.0以及g++编译器均不支持指定初始化器。

#include<stdio.h>
int main(){int i=0;int a[10]={[0 ... 9]=1};for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;
}


#include<stdio.h>
int main(){int i=0;int a[10]={[1]=1,[2]=2,[9]=9};for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;
}

4.使用for循环初始化

#include<stdio.h>
int main(){int i=0;int a[10];for(i=0;i<10;i++)a[i]=i;for(i=0;i<10;i++)printf("%d ",a[i]);printf("\n");return 0;
}

5.总结

比较一下数组初始化的四种方法的优缺点:

  • 初始化参数列表:最常用的方法之一,尤其是初始化为0时非常方便。初始化速度较快;但是当需要把一个很长的数组初始化为非零值时比较麻烦。
  • 使用memset函数进行初始化:适合于char类型数组的初始化,速度较快;缺点是memset不适合初始化char类型以外的数组。
  • 指定初始化器:使用方便,初始化速度较快;缺点是很多编译器不支持该特性,并且C++的语法也不允许使用指定初始化器,可移植性较差。
  • for循环初始化:缺点是速度较慢;但是for循环的移植性较好,几乎适用于所有类型数组的初始化(可以考虑和初始化参数列表int a[10]={0}配合使用,并且release版本的for循环初始化经优化后速度并不慢)

C语言常见问题——数组初始化的四种方法相关推荐

  1. C语言结构体初始化的四种方法

    定义 struct InitMember {int first:double second:char* third:float four; }; 方法一:定义时赋值 struct InitMember ...

  2. java 数组效率_java数组复制的四种方法效率对比

    有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...

  3. c语言数组最大可定义多少位_C语言求数组的最大值三种方法

    /* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...

  4. C语言中字符数组初始化的几种方法

    欢迎关注我的微信公众号:CurryCoder的程序人生 1.C语言中的字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. 1.1 直接 ...

  5. js数组去重的四种方法

    四种算法来实现这个目的: Array.prototype.unique1 = function () {var n = []; //一个新的临时数组for (var i = 0; i < thi ...

  6. php 去重_php求两数组交集的四种方法详解

    题目:给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1],nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5 ...

  7. 【Java】数组拷贝的四种方法

    四种方法 System.arraycopy() 这是一个native的方法,也是对大数组最高效的方法. Arrays.copyOf() 源码如下: public static <T> T[ ...

  8. C语言数组初始化的三种方法

    C语言中,数组初始化的方式主要有三种: 1.声明时,使用 {0} 初始化: 2.使用memset: 3.用for循环赋值. 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: #define ...

  9. c语言long型数组怎么初始化,C语言中数组初始化的三种方式是什么?

    C语言中,数组初始化的方式主要有三种: 1.声明时,使用 {0} 初始化: 2.使用memset: 3.用for循环赋值. 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:#define ...

最新文章

  1. 密位测距离口诀_快速测距法(含简单几何说明)
  2. c语言中go的作用,go语言与c语言的相互调用
  3. python 列表赋值操作可能存在的潜在问题
  4. Kafka常用命令大全
  5. 《UNIX环境高级编程 3rd》笔记(1 / 21):UNIX基础知识
  6. 原码、反码、补码,以及负数的位操作
  7. 英语阅读理解关于计算机,一篇摘选的关于计算机的英语阅读材料,对大家的英语也许会有提高!...
  8. Generator 实现
  9. 有关Data Input类组件的研究——Silverlight学习笔记[26]
  10. 和大家分享一下我最近的编程心得!!!
  11. 计算机键盘中复制粘贴快捷键,电脑复制粘贴快捷键,教您电脑怎么用键盘复制粘贴...
  12. 图文并茂 RAID 技术全解 – RAID0、RAID1、RAID5、RAID100
  13. 解决 CAP_IMAGES: can‘t find starting number (in the name of file)
  14. md格式 linux,Linux命令基本格式以及文件处理命令.md
  15. 基于STM32F407的ADC解析-ADC1多通道扫描模式电压采集实验(启用DMA传输数据)
  16. python+Django搭建web服务器
  17. DOTA2人机决战:2:0!OpenAI击败世界冠军OG
  18. 【4】单机游戏序列化与反序列化
  19. Unity 实现一个分数系统
  20. 新智云助力西门子杨浦楼宇能源开放实验室

热门文章

  1. 建立VLAN虚拟局域网
  2. 团队作业第二次—项目选题报告(葫芦娃)
  3. golang 实现solidity keccak256(abi.encode(xxx))签名
  4. 如何订阅Linux内核邮件列表
  5. 【数据库】——聚集索引和非聚集索引
  6. open-mmlab labelImg mmdetection
  7. 区块链安全20种注意的风险
  8. macos 管理员权限 黑苹果_Mac系统下command显示权限不足的解决方法
  9. 八卦20周年庆主题词:变身文豪有套路!专业解读1999-2019科技发展
  10. 【大赛八卦】2020.3.2-罗马尼亚数学大师赛中国队3金1铜