一、一维数组
C/C++初始化
- 静态数组 int array[100]; //定义了数组array,但并未对数组初始化;
- 静态数组 int array[100] = {0}; //定义了数组array,并将数组元素全部初始化为0;
- 静态数组 int array[100] = {1}; //定义了数组array,并将数组第一个元素初始化为1,后面99个元素初始化为0;
- 静态数组 int array[100] = {4,5}; //定义数组array,并初始化前两个元素为4,5,后面剩余元素初始化为0;
C++动态数组初始
- 动态数组 int *p_array = new int[100]; delete []p_array; //分配了长度为100的数组array,并全部初始化为0;
- 动态数组 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++初始化
- 静态 int array[10][10]; //定义数组,并未初始化(脏数据)
- 静态 int array[10][10] = {{1},{2,2},{3,3,3}}; //数组初始化了array[0][0]及array[1][0,1]及array[2][0,1,2],剩余元素初始化为0;
C++动态数组初始
- 动态 int (*array)[n] = new int[m][n]; delete []array; //默认初始化为0;
- 动态 int *array = new int[m]; for(i) array[i] = new int[n]; for(i) delete []array[i]; delete []array; //多次析构,默认初始化为0;
- 动态 int *array = new int[m][n]; delete []array; //数组按行存储,默认初始化为0
三、三位数组
C++动态数组初始
int *array = new int[m][3][4]; //只有第一维可以是变量,其他维数必须是常量,否则会报错
delete []array; //必须进行内存是否,否则内存将泄漏;
四、数组作为参数形式传递
一维数组传递
- void func(int *array);
- void func(int array[]); //真实使用时,一般还需要给数组大小
二维数组传递
- void func(int **array);
- 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()函数,只能循环处理/定义时初始化;