大家好,欢迎来到IT知识分享网。
C语言中,当我们使用数组的时候,我们或许会希望数组一开始全部被赋予某个特殊的值,我们该怎么做呢?
1.全部赋值为0
int main()
{
int c[5]={
0};//这种办法很简便,但好像只对赋值为 0 才有效,其它的数字都只会给下标为0的赋值
for(int i=0;i<5;i++)
printf("%d ",c[i]);
return 0;
}
//输出结果:
0 0 0 0 0
--------------------------------
Process exited after 0.01611 seconds with return value 0
请按任意键继续. . .
我们当然希望所有的数字都可以这样,只用给一个数字,数组自动全部赋值为那个数字,但现实给了我沉重的一击,请看:
int main()
{
int c[5]={
2};//这种办法很简便,但好像只对赋值为 0 才有效,其它的数字都只会给下标为0的赋值
for(int i=0;i<5;i++)
printf("%d ",c[i]);
return 0;
}
//输出结果:
2 0 0 0 0
--------------------------------
Process exited after 0.01481 seconds with return value 0
请按任意键继续. . .
我们发现,只有下标为0的数字才会被赋值(不是下标为4的那个),其它都不会。于此同时,我们还注意到了一个细节,为何其它未被赋值的都为0呢?难道一开始申请数组默认的都是0?那赋值为0的操作是不是白费呢?我们试试:
int main()
{
int c[5];//k开始不赋值
for(int i=0;i<5;i++)
printf("%d ",c[i]);
return 0;
}
输出结果:
3 0 29 0 29
--------------------------------
Process exited after 0.03592 seconds with return value 0
请按任意键继续. . .
由此可见,定义的数组并没有对里面的内容进行任何初始化,所以初始化为0的那个操作是有意义的,并且是独特的,因为其他数字都不是这样。那又有一个问题,是不是只要随便赋值一个数字,系统所做的工作不仅是把a[0]赋值,并且把其他所有的都赋值为0呢?我们试试:
int main()
{
int c[5];//我们定义一个数组,开始不赋值
int *p = c;//把数组的起始地址存起来
printf("%p\n",p); //16进制输出这个地址
for(int i=0;i<5;i++)
printf("%d ",c[i]); //输出未初始化的数组内容
return 0;
}
//输出结果:
000000000062FDF0
1 0 4203641 0 3
请记住刚才那个地址,接下来我初始化一位数字,如下
int main()
{
int c[5]={
2};//接着赋值一个数字
int *p = c;//把数组的起始地址存起来
printf("%p\n",p); //16进制输出这个地址
for(int i=0;i<5;i++)
printf("%d ",c[i]); //输出初始化一个数字的数组内容
return 0;
}
//输出结果:
000000000062FDF0
2 0 0 0 0
两次数组的起始地址都相同,开始我也没有对这个数组做任何事情,但是只是初始化了一个数字后,后面的所有数字都变成0了(可以看到一开始不是0)
综上所述:如果数组以 a[5]={3}这种方式初始化,系统会给做以下两个动作:
(1)a[0]=3;
(2)数组后面其它内容=0;
这也就统一了a[5]={0}这种所谓的“特殊方式”,其实赋值为0和赋值为其他数字,系统的操作都是一致的,只是恰巧第二步那个数字是0而已,这也是赋值为0的便利之处啦!
- 那么到底该如何赋值为其它数字呢?请看下面:
2.全部赋值为其他数字
(1)for循环,相信这个就不用赘述了。
(2)memset函数的使用
- 头文件
#include <string.h>
#include <memory.h>
- 函数原型
void * memset( void * ptr, int value, size_t num );
- 参数说明
ptr 为要操作的内存的指针。
value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,
int 和 char 可以根据 ASCII 码相互转换。
num 为 ptr 的前 num 个字节,size_t 就是unsigned int
- 函数说明
memset() 会将 ptr 所指的内存区域的前 num 个字节的值都设置为 value,然后返回指向 ptr 的指针
注意:是一个字节一个字节地修改,因此如果是除了char以外的别的类型的数组,就需要用一些技巧才好
- 使用技巧
#include<memory.h>
int main()
{
int d[5],i;
for(i=0;i<5;i++)
{
memset(d+i,7,1);
}
for(i=0;i<20;i++) //输出溢出的数组,这样不会造成严重后果,但是切记不要去修改溢出的数组位,非常危险!
printf("%d ",d[i]);
}
//输出结果:
7 7 7 7 7 0 1 7 2036624 0 4199400 0 0 0 29 0 4225568 0 0 0
//我发现数组溢出的第一个数组单位一般会被赋值为0,只是我没有求证,但很多次都发现这个
我们注意到,memset触及到更底层的东西,修改也是以字节为单位修改的(仅仅在char类型数组下有些实际便利),与数组的多字节固定大小的特性不太符合,因此使用memset来初始化数组难免落入哗众取宠之流,还不如for循环来的直接,毕竟这个也得for循环,并没有降低时间复杂度,因此不提倡。
后续会有更多关于C语言以及java的学习内容,敬请关注…
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14891.html