C/C++ int数组初始化

C/C++ int数组初始化一、一维数组C/C++初始化静态数组intarray[100]; //定义了数组array,但并未对数组初始化;静态数组intarray[100]={0}; //定义了数组array,并将数组元素全部初始化为0;静态数组intarray[100]={1}; //定义了数组array,并将数组第一个元素初始化为1,后面99个元素初始化为0;静态数组intarr…

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

一、一维数组

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,再看一下非基本类型的数组:

string a[5] = { 
    "foo" };

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

string a[5] = { 
    "foo", "", "", "", "" };

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

还有一个区别:

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数组

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数组

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

int数组示例

#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原型

声明:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PyCharm安装及使用

    PyCharm安装及使用

    2021年10月16日
  • yum源本地配置和网络源配置——超级完整详细「建议收藏」

    yum源本地配置和网络源配置——超级完整详细「建议收藏」本地yum源主和客户端服务器配置:红帽系统是可以免费使用的,但是服务是收费的,RHEL7提供了很好的yum源,但是收费,所以如果你的系统是图形化安装,你使用图形化的时候,会有一个窗口弹出,这是红帽的广告插件,但是你不想付费又不想看到这个广告的时候,可以直接关闭的:查看广告插件:yumlistsubscript*,删除插件:yumremovesubscript*-y。首先关…

  • hashmap和hashtable和hashset的区别_的跟得的区别在哪里

    hashmap和hashtable和hashset的区别_的跟得的区别在哪里HashMap和Hashtable的区别两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法

  • linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释

  • ELK入门

    ELK入门ELK入门

  • PS修补工具使用方法[通俗易懂]

    PS修补工具使用方法[通俗易懂]使用场景:当我们在选取图片时,发现有多余的部分想要去除时可以通过PS中的修补工具来帮助我们实现这一操作,如果有对此功能不是很了解的小伙伴请看以下教程,小编将为大家带来PS修补工具的使用方法。方法步骤:一:把一张需要抹除的照片导入到Photoshop中二:然后找到Photoshop工具栏中的这个图标,点击选择”修复画笔工具”三:按住鼠标左键,把要抹去的部分选取出来.选取完成后会有一条虚线.四:保持鼠标在虚线内,按住鼠标左键,向相似的地方移动,这个时候你就会发现鼠标移动到的地方就是填.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号