1、系统内存
1.1 堆和栈的区别
1、栈由系统自动分配,如定义的全局变量等,而堆是人为申请开辟,通过new,malloc进行申请,通过delete,free等进行销毁;
2、栈获得的空间较小,而堆获得的空间较大;
3、栈由系统自动分配,速度较快,而堆一般速度比较慢;
4、栈是连续的空间,而堆是不连续的空间。
2、指针
通过取值符&可以对指针的地址进行操作。
int a=12; int *p=null;`
p=&a;
cout<<*p<<endl; //此时输出结果为12
cout<<p<<endl; //此时输出为a的地址,如ox3242
了解了int *后我们可以通国int **加深对指针的理解
int a=10;
int *p=NULL;
p=&a;
int **mp=NULL;
mp=&p;
3、深入思考
那么p, *p, **p, p + 1, *p + 1, *(p + 1),**p + 1;
int a=10;
int *pi=NULL;
pi=&a;
int **p=NULL;
p=π
cout << p << endl; //输出为P的地址
cout << *p << endl; //输出为int *类型变量的地址
cout << pi << endl; //输出为pi的地址
cout << **p << endl; //输出为10
cout << p + 1 << endl; //输出为相邻p的下一个内存地址
cout << *p + 1 << endl; //输出为pi的下一个内存地址
cout << *(p + 1) << endl; //输出为p的下一个内存地址的内容
cout << **p + 1 << endl; //输出为11
4、动态创建多维数组m*n
使用malloc进行动态创建,其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
创建2440*1000数组
int m = 2440;
int n = 1000;
int **p =NULL;
p = (int **)malloc(m * sizeof(int *));
for(int i = 0; i <n; i++)
{
*(p + i) = (int *)malloc(n * sizeof(int));
}
思考:如何创建3* 2440*1000数组
int m = 2440;
int n = 1000;
int z = 3;
int ***p = NULL;
p = (int ***)malloc(z * sizeof(int **));
for (int i = 0; i < z; i++)
{
*(p + i) = (int **)malloc(m * sizeof(int*));
for (size_t j = 0; j < m; j++)
{
*(*(p+i)+j)= (int*)malloc(n * sizeof(int));
}
}
for (size_t i = 0; i < z; i++)
{
for (size_t j = 0; j < m; j++)
{
for (size_t k = 0; k <n; k++)
{
*(*(*(p + i) + j) + k) = k;
}
}
}
for (size_t i = 0; i < z; i++)
{
for (size_t j = 0; j < m; j++)
{
for (size_t k = 0; k < n; k++)
{
cout<<*(*(*(p + i) + j) + k);
}
}
/*cout << endl;*/
}