前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C/C++ int数组初始化

C/C++ int数组初始化

作者头像
全栈程序员站长
发布2022-09-09 10:46:29
9870
发布2022-09-09 10:46:29
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一、一维数组

C/C++初始化

  1. 静态数组 int array[100]; //定义了数组array,但并未对数组初始化;
  2. 静态数组 int array[100] = {0}; //定义了数组array,并将数组元素全部初始化为0;
  3. 静态数组 int array[100] = {1}; //定义了数组array,并将数组第一个元素初始化为1,后面99个元素初始化为0;
  4. 静态数组 int array[100] = {4,5}; //定义数组array,并初始化前两个元素为4,5,后面剩余元素初始化为0;

C++动态数组初始

  1. 动态数组 int *p_array = new int[100]; delete []p_array; //分配了长度为100的数组array,并全部初始化为0;
  2. 动态数组 int *p_array = new int[100]{3,5}; delete []p_array; //前两个元素初始化为3和5,后面的原始初始化为0;

曾经我想将int数组元素全部初始化为1,我以为下方的写法没有问题:

int a[5] = { 1 }; // 曾经我想全部初始化为1

事实却是,只有数组的第一个元素被初始化为1,其他全为0;

数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。

对应基本类型int来说,就是补0,再看一下非基本类型的数组:

代码语言:javascript
复制
string a[5] = { 
    "foo" };

有了上面的规则,就很容易知道其实相当于:

代码语言:javascript
复制
string a[5] = { 
    "foo", "", "", "", "" };

即后面4个元素调用了string的默认构造函数进行的初始化,而第一个则调用的string::string(const char*)进行的初始化。

还有一个区别:

代码语言:javascript
复制
int a[5];
string a[5];

如果不明确指出初始化列表,那么基本类型是不会被初始化的(除全局变量和静态变量外),所有的内存都是“脏的”;而类类型则会为每个元素调用默认构造函数进行初始化。

注意,在C++11中中间的赋值号可以省略,即 int a[5]{1};并且,如果初始化列表为空,如 int a[5]{},那将初始化所有元素为默认值,即与 int a[5]{0}; 等级

二、二维数组

C/C++初始化

  1. 静态 int array[10][10]; //定义数组,并未初始化(脏数据)
  2. 静态 int array[10][10] = { {1},{2,2},{3,3,3}}; //数组初始化了array[0][0]及array[1][0,1]及array[2][0,1,2],剩余元素初始化为0;

C++动态数组初始

  1. 动态 int (*array)[n] = new int[m][n]; delete []array; //默认初始化为0;
  2. 动态 int *array = new int[m]; for(i) array[i] = new int[n]; for(i) delete []array[i]; delete []array; //多次析构,默认初始化为0;
  3. 动态 int *array = new int[m][n]; delete []array; //数组按行存储,默认初始化为0

三、三位数组

C++动态数组初始 int *array = new int[m][3][4]; //只有第一维可以是变量,其他维数必须是常量,否则会报错 delete []array; //必须进行内存是否,否则内存将泄漏;

四、数组作为参数形式传递

一维数组传递

  1. void func(int *array);
  2. void func(int array[]); //真实使用时,一般还需要给数组大小

二维数组传递

  1. void func(int **array);
  2. void func(int (*array)[n]);

数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在其失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。

五、数组重新置0

char数组

代码语言:javascript
复制
char a[10];
memset(a,0,sizeof(a));		//将每个元素设置为0
memset(a,1,sizeof(a));		//将每个元素设置为1
memset(a,'a',sizeof(a));	//将每个元素设置为a,‘a’ = 97 (ASCII码)
也就是说第二个元素要在ASCII码范围内(0~127)。

int数组

代码语言:javascript
复制
int a[10];
memset(a,0,sizeof(a));	//将每个字节设置为0,此时每个int元素正好也为0
memset(a,1,sizeof(a));	//将每个字节设置为1,此时每个int元素为16843009 = 0x1010101
// 0x1010101 = 1000000010000000100000001(二进制)

int数组示例

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main ()
{ 
   
	int array[10];

	memset(array,0,sizeof(array));
	for(int i=0; i<10; i++)
	{ 
   
		printf("%d\n",array[i]);//输出0
	}
	
	memset(array,1,sizeof(array));
	for(int i=0; i<10; i++)
	{ 
   
		printf("%d\n",array[i]);//输出16843009
	}
	
	return(0);
}

memset原型

声明:

代码语言:javascript
复制
void *memset(void *str, int c, size_t n)

将str中前n个字节用 c 替换并返回 str。 其实这里面的ch就是ascii为ch的字符; 将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值;

memset()的功能是对str的每一个字节进行ASCII赋值,int占四个字节,所以对int数组进行非0赋值或初始化时不能用memset()函数,只能循环处理/定义时初始化;

参考资料: https://www.cnblogs.com/SarahZhang0104/p/5749680.html

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161083.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、一维数组
  • 二、二维数组
  • 三、三位数组
  • 四、数组作为参数形式传递
  • 五、数组重新置0
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档