一维数组的初始化问题

参考了:

http://bbs.youkuaiyun.com/topics/310136813

http://blog.youkuaiyun.com/sibylle/article/details/2026915

个人新博客,欢迎关注:http://liumh.com

一. 数组可以用一个初始列表值来初始化,如下所示:

int array1[] = {1, 5, 8, 9};
char array2[] = {'a', 'c', 'f', 'd', 'a'};

1. 当数组定义时没有指定大小,初始化时使用列表值来初始化了,如上所示,则数组大小由初始化时列表元素个数决定,所以array1大小为4,array2大小为5;

2. 如果明确指定了大小,在初始化时,列表的元素个数超过了已指定的大小则会产生错误,如:

char array[2] ={'a','b',0};   //错误:太多的初始化值了
char array[3] ={'a','b',0};   //正确

3. 如果初始化时指定的列表元素个数比数组大小少,则剩下的元素都会被初始化为0;如

int array[8]={1,2,3,4};
等价于
int array[8]={1,2,3,4,0,0,0,0};

4. 字符数组可以方便的用字符串进行初始化,例如:

char string[] = "abcdefghijklmn";

二. 使用memset初始化数组

先看看memset的函数说明:

MEMSET(3)                BSD Library Functions Manual                MEMSET(3)

NAME
     memset -- fill a byte string with a byte value

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <string.h>

     void *
     memset(void *b, int c, size_t len);

DESCRIPTION
     The memset() function writes len bytes of value c (converted to an unsigned char) to the byte string b.

RETURN VALUES
     The memset() function returns its first argument.

SEE ALSO
     bzero(3), memset_pattern(3), swab(3), wmemset(3)

STANDARDS
     The memset() function conforms to ISO/IEC 9899:1990 (``ISO C90'').

memset通常用来对一段内存空间全部设置为某个字符,一般情况下用于对定义的字符串进行初始化为 ' ' 或者 ’\0';例如

char array[100];
memset(array, '\0', sizeof(array));

也可这样初始化一个整型数组为0:

int array[10]; 
memset(array, 0, sizeof(array));

但是,看下面的例子:

int array[10]; 
memset(array, 1, sizeof(array));

是否array中所有的值都为1呢?

答案:不为1,而都是16843009,这是为何呢?

从上面的memset函数说明可以看出,memset的初始化是按字节进行的,在进行memset(array, 1, sizeof(array));调用时,就是对array执行的sizeof(array)个字节进行赋值,每个字节都用ASCII为1的字符去填充,转为二进制后,1就是 00000001,占一个字节,一个 int 类型占4个字节,合起来就是 1 00000001 00000001 00000001,即16843009.就完成了对一个int类型的赋值,所以上面数组中的值都为16843009.

三. 用循环初始化数组

例如:

int array[10];
for(int i = 0; i < 10; ++ i)
        array[i] = 0;

这个肯定成功。



### 一维数组初始化方法和规则 #### 1. 静态初始化 - **指定数组大小并初始化** - 可以在定义数组时指定数组大小,并在花括号 `{}` 中提供初始值。初始值会按顺序依次赋给数组元素。如果提供的初始值数量少于数组大小,剩余的元素会被自动初始化为 0(对于数值类型)或 `'\0'`(对于字符类型)。 ```c // 初始化整型数组 int numbers[5] = {1, 2, 3, 4, 5}; // 初始化字符数组 char characters[3] = {'a', 'b', 'c'}; ``` - **不指定数组大小初始化** - 可以省略数组大小,编译器会根据花括号中提供的初始值数量自动确定数组大小。 ```c // 整型数组,大小为 4 int values[] = {10, 20, 30, 40}; // 字符数组,大小为 5 char letters[] = {'h', 'e', 'l', 'l', 'o'}; ``` - **部分初始化** - 当提供的初始值数量少于数组大小时,数组剩余元素会被初始化为 0(数值类型)或 `'\0'`(字符类型)。 ```c // 数组大小为 5,前两个元素为 1 和 2,后三个元素为 0 int partial[5] = {1, 2}; ``` #### 2. 动态初始化(C++ 中使用 `std::vector`) 在 C++ 中,可以使用 `std::vector` 来实现动态数组,并且可以在创建时进行初始化。 ```cpp #include <vector> #include <iostream> int main() { // 初始化一个包含 5 个元素,每个元素值为 10 的向量 std::vector<int> vec(5, 10); for (int i = 0; i < vec.size(); ++i) { std::cout << vec[i] << " "; } return 0; } ``` #### 3. 字符数组的字符串初始化 对于字符数组,可以使用字符串字面量进行初始化,字符串字面量会自动在末尾添加空字符 `'\0'` 作为字符串结束标志。 ```c // 字符数组大小为 6,包含 'h', 'e', 'l', 'l', 'o', '\0' char str[] = "hello"; ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值