C语言常见问题——数组初始化的四种方法
有一回,小易同学对我说:“你学过编程吗”,我略略点一点头。他说,“学过编程,我便考一考你,在使用数组之前,应不应该初始化数组?”
我暗想,这么简单的问题,也配考我么?不只是数组,在使用任何变量之前,都应该对变量进行初始化,这是一个编程的好习惯,可以有效避免许多由于垃圾值导致的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语言常见问题——数组初始化的四种方法相关推荐
- C语言结构体初始化的四种方法
定义 struct InitMember {int first:double second:char* third:float four; }; 方法一:定义时赋值 struct InitMember ...
- java 数组效率_java数组复制的四种方法效率对比
有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...
- c语言数组最大可定义多少位_C语言求数组的最大值三种方法
/* 黄哥Python培训 黄哥所写*/#include int maxValue(int* arr, int n);int maxRecursionValue(int* arr, int n);in ...
- C语言中字符数组初始化的几种方法
欢迎关注我的微信公众号:CurryCoder的程序人生 1.C语言中的字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. 1.1 直接 ...
- js数组去重的四种方法
四种算法来实现这个目的: Array.prototype.unique1 = function () {var n = []; //一个新的临时数组for (var i = 0; i < thi ...
- php 去重_php求两数组交集的四种方法详解
题目:给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1],nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5 ...
- 【Java】数组拷贝的四种方法
四种方法 System.arraycopy() 这是一个native的方法,也是对大数组最高效的方法. Arrays.copyOf() 源码如下: public static <T> T[ ...
- C语言数组初始化的三种方法
C语言中,数组初始化的方式主要有三种: 1.声明时,使用 {0} 初始化: 2.使用memset: 3.用for循环赋值. 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: #define ...
- c语言long型数组怎么初始化,C语言中数组初始化的三种方式是什么?
C语言中,数组初始化的方式主要有三种: 1.声明时,使用 {0} 初始化: 2.使用memset: 3.用for循环赋值. 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:#define ...
最新文章
- 密位测距离口诀_快速测距法(含简单几何说明)
- c语言中go的作用,go语言与c语言的相互调用
- python 列表赋值操作可能存在的潜在问题
- Kafka常用命令大全
- 《UNIX环境高级编程 3rd》笔记(1 / 21):UNIX基础知识
- 原码、反码、补码,以及负数的位操作
- 英语阅读理解关于计算机,一篇摘选的关于计算机的英语阅读材料,对大家的英语也许会有提高!...
- Generator 实现
- 有关Data Input类组件的研究——Silverlight学习笔记[26]
- 和大家分享一下我最近的编程心得!!!
- 计算机键盘中复制粘贴快捷键,电脑复制粘贴快捷键,教您电脑怎么用键盘复制粘贴...
- 图文并茂 RAID 技术全解 – RAID0、RAID1、RAID5、RAID100
- 解决 CAP_IMAGES: can‘t find starting number (in the name of file)
- md格式 linux,Linux命令基本格式以及文件处理命令.md
- 基于STM32F407的ADC解析-ADC1多通道扫描模式电压采集实验(启用DMA传输数据)
- python+Django搭建web服务器
- DOTA2人机决战:2:0!OpenAI击败世界冠军OG
- 【4】单机游戏序列化与反序列化
- Unity 实现一个分数系统
- 新智云助力西门子杨浦楼宇能源开放实验室
热门文章
- 建立VLAN虚拟局域网
- 团队作业第二次—项目选题报告(葫芦娃)
- golang 实现solidity keccak256(abi.encode(xxx))签名
- 如何订阅Linux内核邮件列表
- 【数据库】——聚集索引和非聚集索引
- open-mmlab labelImg mmdetection
- 区块链安全20种注意的风险
- macos 管理员权限 黑苹果_Mac系统下command显示权限不足的解决方法
- 八卦20周年庆主题词:变身文豪有套路!专业解读1999-2019科技发展
- 【大赛八卦】2020.3.2-罗马尼亚数学大师赛中国队3金1铜