C语言数组初始化为一个数字的技巧

C语言数组初始化为一个数字的技巧C语言中,当我们使用数组的时候,我们或许会希望数组一开始全部被赋予某个特殊的值,我们该怎么做呢?1.全部赋值为0intmain(){ intc[5]={0};//这种办法很简便,但好像只对赋值为0才有效,其它的数字都只会给下标为0的赋值 for(inti=0;i<5;i++) printf(“%d”,c[i]); return0;}//输出结果:0…

大家好,欢迎来到IT知识分享网。C语言数组初始化为一个数字的技巧"

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 类型的值,
intchar 可以根据 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

(0)
上一篇 2024-02-21 19:00
下一篇 2024-02-24 19:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信