以int** a为例
1.二级指针的声明
-
a
是一个指向int*
(指向整型的指针)的指针,即二级指针。 -
通俗的讲,a是一个指向指针的指针,对a解引用会是一个指针。
-
它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针的场景。
2.动态二维数组的表示
-
例如动态分配一个
N×M
的二维数组:int **a =(int**)malloc(N*sizeof(int*)); for(int i=0;i<N;i++){ *(a+i)=(int*)malloc(M*sizeof(int)); //a[i]=(int*)malloc(M*sizeof(int)); }
3.函数参数传递
-
当二级指针作为函数参数传递是,有以下几种意思:
-
1.作为指针数组使用:
-
void example(int **a,int size){ for(int i=0;i<size;i++){ a[i]=NULL;//初始化 } }
2.作为二维数组使用:
-
void example(int **a,int size,int *aColSize){ for(int i=0;i<size;i++){ for(int j=0;j<aColSize[i];j++){ a[i][j]=0;//初始化 } } }
3.作为传回的指针使用:
-
void example(int **a){ *a=NULL; }
和这段代码是一样的作用:
-
int* example(int* a){ a=NULL; return a; }
注意:
-
1.虽然二级指针作为函数参数传递可以作为二维数组使用,但不能将二维数组作为二级指针接收的参数使用!
-
例如以下是错误做法:
-
void example(int **a,int size,int *aColSize){ for(int i=0;i<size;i++){ for(int j=0;j<aColSize[i];j++){ a[i][j]=0;//初始化 } } } int main() { int N,M; scanf("%d %d",&N,&M); int a[N][M]; int b[M]; for(int i=0;i<N;i++){ b[i]=M; } example(a,N,b); return 0; }