数组的初始化
http://blog.csdn.net/sibylle/archive/2008/01/05/2026915.aspx
数组的初始化是一个简单的不能再简单,常见的不能再常见的用法。好像没什么可讲的啊,哈哈,不过,你确定对这个问题已经很了解了吗?
同志,不得不提醒你一下,一旦犯错误,越是常见的用法,产生的危害也就越大,所以强烈建议你把我这篇文章看下去。
开始之前,题外一句,“实验是检验代码的唯一标准”!
可以char str[];但是这只是指针,不是数组
因为C++不允许这样初始化数组
但是你可以这样
int n;
char *str;
cin>>n;
str=new((char)n);
cin.getline(str);
然后再输入想要的字符串
(其中n是你要输入字符数+1,因为最后一位是'\n')
一、将数组所有元素初始化为0
1. 大括号形式
char a[4] = {0};
long c[4] = {0};
2. 字符串形式
char b[4] = "";
long d[4] = "";
说明:
1)上面两种形式实际上都只是将数组的第一个元素置零了,但由于未初始化为0的元素系统会自动初始化为0,所以产生的效果是所以元素都被置零了。但大家不 要误认为{n}的作用是初始化数组的所有元素值为n。需要强调的是,程序员至少必须把数组元素的第一个数组元素初始化为0,才能使剩余的元素自动初始化为 0。也就是说,定义数组后必须要初始化,不要认为不初始化,系统就会自动初始化为0。实际上,把数组初始化为0是在编译时完成的。如果不初始化,那么各数 组元素的值将是随机数。
2)允许以字符串的形式初始化数组,所以,{0}和""的效果是一样的。而且,有时为了表示里面存的是字符串,使用""更醒目。
二、将数组所有元素初始化为非0
1. for循环
char i = 0;
char a[4];
long b[4];
for (i = 0; i < 4; i++)
{
a[i] = 1;
b[i] = 1;
}
结果:
值的情况:
a[0] = a[1] = a[2] = a[3] = 0x01;
b[0] = b[1] = b[2] = b[3] = 0x01;
内存情况(每行八个字节,值为十六进制表示):
a:01 01 01 01
b:00 00 00 01 00 00 00 01
00 00 00 01 00 00 00 01
2. memset
char a[4];
long b[4];
memset (a, 1, sizeof (a));
memset (b, 1, sizeof (b));
结果:
值的情况:
a[0] = a[1] = a[2] = a[3] = 0x01;
b[0] = b[1] = b[2] = b[3] = 0x01010101;
内存情况(每行八个字节,值为十六进制表示):
a:01 01 01 01
b:01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01
说明:
1)for循环和memset的只在char型数组时效果相同,其余情况效果不同,请认真区分二者的区别。
2)对于非char型数组,使用memset时一定要小心,它是按字节进行赋值的,如果你是想将非char型数组的每个元素置为定值,而不是将内存每8位置为定量,最好使用for循环而不是memset。
三、错误用法
char a[4] = {1};
long b[4] = {1};
结果:
值的情况:
a[0] = 0x01, a[1] = a[2] = a[3] = 0x00;
b[0] = 0x01, b[1] = b[2] = a[3] = 0x00;
内存情况(每行八个字节,值为十六进制表示):
a:01 00 00 00
b:00 00 00 01 00 00 00 00
00 00 00 00 00 00 00 00
说明:
之前已经说了,上面这种用法的结果是只有数组的第一个元素被赋值了。很多人都在用这种方法对数组进行初始化,但实际上这是一个错误的用法,并不能实现将所有元素初始化为同一数组的目的(置零除外)。
数组的初始化是一个简单的不能再简单,常见的不能再常见的用法。好像没什么可讲的啊,哈哈,不过,你确定对这个问题已经很了解了吗?
同志,不得不提醒你一下,一旦犯错误,越是常见的用法,产生的危害也就越大,所以强烈建议你把我这篇文章看下去。
开始之前,题外一句,“实验是检验代码的唯一标准”!
可以char str[];但是这只是指针,不是数组
因为C++不允许这样初始化数组
但是你可以这样
int n;
char *str;
cin>>n;
str=new((char)n);
cin.getline(str);
然后再输入想要的字符串
(其中n是你要输入字符数+1,因为最后一位是'\n')
数组的初始化
在了一些朋友写的代码时,一个简单的数组初始化,把人那个搞的,又是for循环,又是判断长度.
一般的数组初始化,也就是申请数组的时候我们就初始化,
1.char buffer[1000] = {0}; //一般的话,我们只将数组初始化为0,然后再使用.
C++中,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋值给其余的元素.
2.char buffer[] = {1,2,3,4,5,6}; 数组会自动计数,我们不用指定数字,以免画蛇添足反而出错。
3.char buffer[1000]; memset(buffer,10,sizeof(buffer)),对于有特殊需要的我们可以这样将数组中的值全部初始化为1个值,没必要用for循环,效率不高。
但是char buffer[1000]; memset (buffer,0,sizeof(buffer)) ,个人觉得这有点多此一举.
一、将数组所有元素初始化为0
1. 大括号形式
char a[4] = {0};
long c[4] = {0};
2. 字符串形式
char b[4] = "";
long d[4] = "";
说明:
1)上面两种形式实际上都只是将数组的第一个元素置零了,但由于未初始化为0的元素系统会自动初始化为0,所以产生的效果是所以元素都被置零了。但大家不 要误认为{n}的作用是初始化数组的所有元素值为n。需要强调的是,程序员至少必须把数组元素的第一个数组元素初始化为0,才能使剩余的元素自动初始化为 0。也就是说,定义数组后必须要初始化,不要认为不初始化,系统就会自动初始化为0。实际上,把数组初始化为0是在编译时完成的。如果不初始化,那么各数 组元素的值将是随机数。
2)允许以字符串的形式初始化数组,所以,{0}和""的效果是一样的。而且,有时为了表示里面存的是字符串,使用""更醒目。
二、将数组所有元素初始化为非0
1. for循环
char i = 0;
char a[4];
long b[4];
for (i = 0; i < 4; i++)
{
a[i] = 1;
b[i] = 1;
}
结果:
值的情况:
a[0] = a[1] = a[2] = a[3] = 0x01;
b[0] = b[1] = b[2] = b[3] = 0x01;
内存情况(每行八个字节,值为十六进制表示):
a:01 01 01 01
b:00 00 00 01 00 00 00 01
00 00 00 01 00 00 00 01
2. memset
char a[4];
long b[4];
memset (a, 1, sizeof (a));
memset (b, 1, sizeof (b));
结果:
值的情况:
a[0] = a[1] = a[2] = a[3] = 0x01;
b[0] = b[1] = b[2] = b[3] = 0x01010101;
内存情况(每行八个字节,值为十六进制表示):
a:01 01 01 01
b:01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01
说明:
1)for循环和memset的只在char型数组时效果相同,其余情况效果不同,请认真区分二者的区别。
2)对于非char型数组,使用memset时一定要小心,它是按字节进行赋值的,如果你是想将非char型数组的每个元素置为定值,而不是将内存每8位置为定量,最好使用for循环而不是memset。
三、错误用法
char a[4] = {1};
long b[4] = {1};
结果:
值的情况:
a[0] = 0x01, a[1] = a[2] = a[3] = 0x00;
b[0] = 0x01, b[1] = b[2] = a[3] = 0x00;
内存情况(每行八个字节,值为十六进制表示):
a:01 00 00 00
b:00 00 00 01 00 00 00 00
00 00 00 00 00 00 00 00
说明:
之前已经说了,上面这种用法的结果是只有数组的第一个元素被赋值了。很多人都在用这种方法对数组进行初始化,但实际上这是一个错误的用法,并不能实现将所有元素初始化为同一数组的目的(置零除外)。