#include <iostream>
#include <string>
#include <Windows.h>
#include <time.h>
#include <cstdlib>
using namespace std;
int * test(int count);
void test_1(int count, int ** point);
void test_2();
int main(void)
{
//优点1:按需分配 节约内存空间
int sa[5] = {10,15,41,12,41};
int *p1 = new int [sizeof(sa)/sizeof(sa[0])];
memcpy(p1, sa, sizeof(sa)); //这个是把 sa数组里的元素复制到 p1里面来
for (auto i = p1; i < p1+5 ;i++)
cout << *i <<endl;
delete [] p1;
//优点2:堆区是不同程序员间提供接口的 一种存储方式 就是把函数内的指针返回到函数外用
srand((unsigned)time(nullptr));
int *temp = test(5); //这里是转接这块内存的使用权限
for (int i = 0; i < 5 ; i++)
cout << *(temp + i) << endl;
delete [] temp; //释放数组
//用二级指针带出函数里面被 初始化的 堆内存
int *temp_1 = nullptr;
test_1(5, &temp_1); //细节: 函数不用设返回值
for (int i = 0; i < 5; i++)
cout << *(temp_1 + i) << endl;
delete[] temp_1; //释放数组
//优点3:堆区要比栈区的空间要大的多
printf_s("开始 \n");
test_2();
printf_s("结束 \n");
system("pause");
return 0;
}
//优点2:堆区是不同程序员间提供接口的 一种存储方式 就是把函数内的指针返回到函数外用
int * test(int count)
{
int *p2 = nullptr; //这个变量名是一个栈变量 函数结束时 就会消失
p2 = new int[count]; //函数结束 这个内存还是存在的
for (int i = 0; i < count; i++)
*(p2+i) = rand() % 100;
for (int i = 0; i < count; i++)
cout << *(p2 + i) << " ";
cout << endl;
return p2;
}
//二级指针的带出函数里被初始化的内存
void test_1(int count, int** point)
{
//这个 a 变量名是 栈空间的函数结束时释放 所以函数结束时 堆空间的所有权时还给 *point 但是指向的内存是堆空间的
int * a = nullptr;
*point = new int [count];
a = *point;
for(int i = 0;i < count;i++)
*(a+i) = rand()%10;
for (int i = 0;i < count;i++)
cout << *(a + i) << endl;
return ;
}
void test_2()
{
//int a[102400*2]; //100k*3*4个字节1.2M //栈空间大约只有1M左右
int *a = new int [1024*1000*250]; //堆空间大约有1G左右
a[0] = 0;
cout << "this is a demo." << endl;
}