// 申请空间int**p = new int*[4];// 动态申请 4 行二维数组for(int i =0; i <4; i++)// 每行申请 10 个长度的数组
p[i]= new int[10];// 释放空间for(int i =0; i <4; i++)
delete []p[i];
delete []p;
方法二:内存连续
// 申请空间int**p = new int*[4];// 动态申请 4 行二维数组
p[0]= new int[4*10];// 每行申请 10 个长度的数组// 释放空间
delete []p;
取地址(&)和解引用(*)
语句/表达式
含义
a
a[0][0] 地址,或 0 行起始地址
*a
a[0][0] 地址,或 0 行起始地址
*(a + 0)
a[0][0] 地址,或 0 行起始地址
a[0]
a[0][0] 地址,或 0 行起始地址
&a
取得 a[0][0] 地址,或 0 行起始地址
&a[0]
取得 a[0][0] 地址,或 0 行起始地址
&a[0][0]
取得 a[0][0] 地址
a[0][0]
a[0][0] 的值
*a[0]
a[0][0] 的值
*(*(a + 0) + 0)
a[0][0] 的值
**a
a[0][0] 的值
语句/表达式
含义
a + 3
a[3][0] 地址,或 3 行起始地址
*(a + 3)
a[3][0] 地址,或 3 行起始地址
a[3]
a[3][0] 地址,或 3 行起始地址
&a[3]
取得 a[3][0] 地址,或 3 行起始地址
&a[3][0]
取得 a[3][0] 地址
a[3][0]
a[3][0] 的值
*a[3]
a[3][0] 的值
*(*(a + 3) + 0)
a[3][0] 的值
**(a + 3)
a[3][0] 的值
语句/表达式
含义
*(a + 3) + 2
a[3][2] 地址
a[3] + 2
a[3][2] 地址
&a[3][2]
取得 a[3][2] 地址
a[3][2]
a[3][2] 的值
*(a[3] + 2)
a[3][2] 的值
*(*(a + 3) + 2)
a[3][2] 的值
提示:*表示解引用一次,得到的只是地址;**表示解引用两次,得到的是值。
作函数形参
语句/表达式
含义
void fun (int a, int b[][])
错误写法,二级指针不等同于二维数组
void fun (int a, int **b)
错误写法,二级指针不等同于二维数组
void fun (int a, int b[4][10])
形参 b 显式给出数组的行列大小,必须将形如[4][10]的整型数组作为实参
void fun (int a, int b[][10])
形参 b 必须至少显式给出数组的列大小,形如[x][10]的整型数组可以作为实参
void fun (int a, int (*b)[10])
形参 b 必须至少显式给出数组的列大小,形如[x][10]的整型数组可以作为实参
void fun (int a, int *b)
可以将二维数组 T 作为 b 的实参,但在函数内部只能使用一维数组的方式去访问 T
4. 函数指针
定义声明
声明
类型
含义
int f()
int ()
返回值为整型的函数
int *f()
int *()
(指针函数)返回值为整型指针的函数
int (*f)()
int (*)()
(函数指针)指向函数的指针,该函数的返回值为整型
int *(*f)()
int *(*)()
指向函数的指针,该函数的返回值为整型指针
int (*f[10])()
int (*[10])()
(数组指针)有 10 个函数指针的数组,这些函数的返回值均为整型
int *(*f[10])()
int *(*[10])()
(数组指针)有 10 个函数指针的数组,这些函数的返回值均为整型指针
int *(*(*f[10]))()
int *(*(*[10]))()
指向一个有 10 个函数指针的数组的指针,这些函数的返回值均为整型指针
int (*f)(int, int)
int (*)(int, int)
指向函数的指针,该函数有两个整型参数,其返回值为整型
int (*f)(int*, int*)
int (*)(int*, int*)
指向函数的指针,该函数有两个整型指针参数,其返回值为整型
int *(*f)(int*, int*)
int *(*)(int*, int*)
指向函数的指针,该函数有两个整型指针参数,其返回值为整型指针
提示:如何记忆指针函数和函数指针的区别?
X 型函数(函数返回的是 X 类型的数据):整型函数、浮点型函数、字符型函数组、指针函数
X 型指针(指针指向 X 类型的数据):整型指针、浮点型指针、字符型指针、数组指针、函数指针
取地址(&)和解引用(*)
(已定义函数int f(int a, int *b),函数指针int (*p1)(int, int*),函数指针void (*p2)(int, int*),变量int x, y)