再谈C指针
指针数组
引子
今天看到一个题,要求创建NxN的行列式,确实没有比n维数组更好的形式了。那么问题来了
如何动态生成n维数组呢
代码
//动态创建N×N二维数组(先分配行指针数组,再分配每行内存)
int **matrix = (int **)malloc(n * sizeof(int *));
if (matrix == NULL)
{
printf("内存分配失败!\n");
return 1;
}
for (int i = 0; i < n; i++)
{
matrix[i] = (int *)malloc(n * sizeof(int));
if (matrix[i] == NULL)
{
printf("内存分配失败!\n");
// 若某行分配失败,需释放已分配的行,避免内存泄漏
for (int j = 0; j < i; j++) free(matrix[j]);
free(matrix);
return 1;
}
}
二级指针 & 指针数组
int **matrix二级指针
matrix[0]指向的依旧是一个地址
- 代码中创建了一个n个指针数组
- 二级指针 <--> 一维指针数组
通过动态内存给matrix[0]分配了n个列元素
所以matrix[x][y]是x行y列的元素
数组指针
int arr[N];
int (*p)[N] =&arr;
- p就是一个指向arr的数组指针
- p的类型为指向** N x int **的指针
所以 p+1的值就变成了p[N+1],造成访问越界
函数指针
int a(int);
int (*p)(int);
- p就是一个指向a的数组函数,*p的值为a的返回值
- 注意:不要对函数指针做运算和寻址,实测gcc编译器不报错,但是会产生不可预料的错误

浙公网安备 33010602011771号