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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一

    [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一统一建模语言(UnifiedModelingLanguage,UML)可分类成:功能模型:从用户的角度展示系统的功能,包括用例图。对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。动态模型:展现系统的内部行为。包括序列图,活动图,状态图。类图说到类图,它包含的东西确实有点多,你去网上看总能看到,同样都是类图,但是好像各有各家的章法,总让人摸不着头脑。要么少个箭头要么实线变成虚线了… 那这个类图到底有没有标准呢?别慌,有的,《大话设.

    2022年7月12日
    22
  • openldap设置ACL

    openldap设置ACL安装好了 openldap 之后 就是对它进行配置了 其中一项就是设置访问控制 限制普通用户只能修改 访问他们能修改 访问的项

    2025年8月5日
    3
  • mysql的where条件后加case_recommend

    mysql的where条件后加case_recommend背景:数据库用的Oracle;报表用的是【FineReport】,之前没用过,被临时授命解决问题,所以大概了解了一下。里面应该是集成了excel插件,报表样式如下:今天在项目中遇到一个这样的场景:A为汇总页面,显示的是按医院分组统计出来的一些数据,效果如下图图中每一列都能下钻到另一个页面,医院名称和起始时间都作为参数传送。前期因为某一些需求,有一家医院出现了两个不同的名…

    2025年9月3日
    8
  • 剑指offer答案_一年级聪明格题目

    剑指offer答案_一年级聪明格题目本文为《剑指Offer》刷题笔记的总结篇,花了两个多月的时间,将牛客网上《剑指Offer》的66道题刷了一遍,以博客的形式整理了一遍,这66道题属于相对基础的算法题目,对于刷题练手是很好的实践,接下来

    2022年8月4日
    4
  • Cache基础知识OR1200在ICache一个简短的引论

    Cache基础知识OR1200在ICache一个简短的引论

    2022年1月9日
    41
  • 使用git stash命令保存和恢复进度[通俗易懂]

    使用git stash命令保存和恢复进度[通俗易懂]使用git stash命令保存和恢复进度

    2022年4月24日
    59

发表回复

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

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