二级指针
void test19() {
long **p = NULL;
long l[] = {11, 12};
*p = &l;// crash, 因为二级指针汇总不允许直接操作一级指针
}
/**
* 对比test19(),定义的二级指针**p后, 是不能直接操作*p
*/
void test20(){
long **p = NULL;
long l[2][2] = {{11, 12},
{21,22}};
p = &l;
long *tmp = p+1;
printf("%d",*(tmp+0));
}
/**
* 1.定义的二级指针**p后, 是不能直接操作*p, 只能操作p
* 2.操作p时,可以对p直接赋予一个地址; 可如果把p当成数组直接赋值,需要先对p申请内存,否者报错
* 3.理解二级指针做类二维数组的操作,但是比二维数组更加灵活,可以扩容,可以非矩阵形式即每行元素个数可以不统一
* 4.对2的理解:指针当成数组操作时必须要先申请合适的内存空间
*/
void test21(){
long **p = malloc(sizeof(long)*9);
long *p1=11;
long *p2 =12;
p[0] = p1;
p[1] = p2;
}
二级指针的常见操作:
定义一个二级指针p
对二级指针分配内存
将一个内存地址分配给p[]的形式