再谈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编译器不报错,但是会产生不可预料的错误
posted @ 2025-10-26 10:13  loong2525  阅读(20)  评论(0)    收藏  举报