int a

a是int类型的变量,内存中被命名为a的空间内保存的是一个整形数据

int* b

b是int类指针类型的变量,内存中被命名为b的空间内保存的是一个整形指针(整形的地址)的数据

int** c

c是int类型的指针的指针类型的变量,内存中被命名为c的空间内保存的是一个整形指针的指针(整形指针的地址)的数据

一维数组

1
2
3
4
int a[4];
//int是数组中元素的类型,a是数组的名称,也是数组的首元素的地址的引用,数组的元素在内存中是连续开辟的
int* b[3];
//数组b中的元素数据类型是int*,即整形指针
一维数组的动态开辟:
1
2
int* a = new int[10];
//new了一个长度为10的int类型动态数组,并将数组的地址返回给a

别忘什么是动态内存:

栈中的内存开辟需要在编译前就要确定具体大小,比如在定义一个普通数组的时候,这个数组的大小一定是已知的,是一个常量,就算是用一个整形变量a用来在定义数组的时候表示数组的大小,在编译之前a的值也是一定要确定下来的

动态内存是在堆中开辟的,动态开辟内存就是在编译之前可以不指定需要开辟的空间的大小,在编译之后再根据程序猿的指定开辟相应的大小。

二维数组

如果在栈中定义二维数组(比如局部变量),二维数组本质上就是一个一维数组,然后将一维数组按照指定的大小分成等分,比如一个m*n的二维数组,意思是m行n列,其实是将一个长度为m *n的等分为m份,每一份中有n个元素

1
2
int a[3][4];
//这是一个3行四列的二维数组,本质上是由一个含有12个元素的一维数组,平均分成了三份,每份中四个元素

栈中的二维数组每行必须等长

IMG_4084
二维数组的动态开辟:
1
2
3
4
5
6
7
int** a = new int* [m];
//先new一个元素类型为int* 的m个元素大小的一维数组
for(int i = 0 ; i < m ; i++)
{
a[i] = new int [n]
}
//这个一位数组中的每个元素都是新开辟的一维数组的地址的指针

动态开辟二维数组,实际上是先new一个数组元素为指针的一维数组,这个一维数组中的每个元素都是指向一个新开辟的一维数组地址的指针

所以在堆中开辟的二维数组并不要求每行都是等长的

IMG_4085