动态数组初始化
使用new创建数组的时候,返回的是指向0号元素的指针
int* nums1 = new int[10]{0,1}; //前两个元素用给的值,其他的元素用int类型默认值
int* nums2 = new int [10] (); //使用int类型默认值初始化
int* nums3 = new int[10]{}; //使用int类型默认值初始化
int* nums4 = new int[10]; //不初始化数组
#include<iostream>
using namespace std;
void show(int* num, int len){
for(int i=0; i<len; i++){
cout<<num[i]<<" ";
}
cout<<endl;
}
int main(){
int* nums1 = new int[10]();//使用默认值初始化数组
int* nums2 = new int[10]{};//使用默认值初始化数组
int* nums3 = new int[10]{0,1};//前两个元素用给的值,其他的元素用int类型默认值
int* nums4 = new int[10];//不初始化数组
show(nums1, 10);
show(nums2, 10);
show(nums3, 10);
show(nums4, 10);
delete []nums1;//记得delete,否则会内存泄漏
delete []nums2;
delete []nums3;
delete []nums4;
return 0;
运行结果:
memset()函数
所属头文件: <string.h>
原型: void * __cdecl memset(void *_Dst, int _Val, size_t _Size);
参数说明:
- _Dst:数组初始化的起始地址
- int _Val:表示初始化的值
- _Size:表示初始化的字节范围
作用: 从地址_Dst开始,将字节范围为_Size的内存全部赋值为_Val
案例:
memset(nums4, -1, sizeof(int)*10);
show(nums4, 10);
delete []nums4;
运行结果:
换个值初始化试试
memset(nums4, 1, sizeof(int)*10);
show(nums4, 10);
delete []nums4;
运行结果:
我们得到了一串随机值
初始化char型数组
char c[10];
//上面源码部分第2个参数是int*,但是可以传char型数据
//具体不太清楚,但源码就是这样的
memset(c, 'a', sizeof(char)*10);
show(c, 10);
运行结果:
总结: 对于int类型数组,memset函数只能初始化为0或-1。能初始化char型数组,不能初始化float,double
动态开辟二维数组
int row = 3;
int col = 4;
int** arr2 = (int**)malloc(sizeof(int*) * row);
if (NULL == arr2) {
exit(1);
}
for (int i = 0; i < col; i++) {
arr2[i] = (int*)malloc(sizeof(int) * col);
if (NULL == arr2[i]) {
exit(1);
}
}
printf("%d\n", arr2[1][2]);
printf("%d\n", *(arr2[1]+2));
printf("%d\n", *(*(arr2+1)+2)); // *(arr2+1)使得二级指针变成一级指针
for (int i = 0; i < row; i++) {
free(arr2[i]);
arr2[i] = NULL;
}
free(arr2);
arr2 = NULL;
int arr[3][4]; // 数组名表示数组首元素地址,arr包括3个元素
int num = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
arr[i][j] = num;
num++;
}
}
printf("%d\n", arr[1][2]);
printf("%d\n", *(*(arr+1)+2));//*(arr+1)从指向数组的指针变成指向元素的指针