大家好,又见面了,我是你们的朋友全栈君。
C/C++初始化
C++动态数组初始
曾经我想将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++初始化
C++动态数组初始
C++动态数组初始 int *array = new int[m][3][4]; //只有第一维可以是变量,其他维数必须是常量,否则会报错 delete []array; //必须进行内存是否,否则内存将泄漏;
一维数组传递
二维数组传递
数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针,而且在其失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
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.cn/161083.html原文链接:https://javaforall.cn