什么叫二级指针,二级指针的用法

1,二级指针的用法用内存地址去理解吧,一级指针是指向定义类型的内存地址,二级指针就是指向定义类型的内存地址所指向的新的内存地址 。我举一个例子 。#include void main()
2,C语言struct 指针你好~struct test *head;是创建了一个你的struct test这个类型的结构体~所以head->a 就是指你新创建里面的int类型的a~你这个是在练习链表吧~structa;a属于普通结构变量,(比如int a;整型变量 。占用4个字节的内存,内存地址固定,只要没有声明为const则其值可变)struct a的内存占用大小视我们规定struct拥有哪些变量,总大小就是它的内部变量占用字节之和 。那么,类似的 。指针结构 , 就是内存给出一个结构体的首地址,其他操作与普通指针一样(指针本身是动态的) 。二级指针,可以理解成结构体子变量指针,通常用来在链表中指向另一个结构体的地址(脱离链表的二级指针实际上也没什么用,所以可以是这样说 , 它就是指向下个结构地址(成为结点)的指针) 。使用二级指针可以方便的存储和访问结构中的数据 。在一般情况下 , 它和普通数组的效果一样 。在内存使用方面,内存使用效率w=每个元素大小e/(元素大小e+指针(节点)占用内存h)*100%举个例子:链表(struct指针)w=80/(80+20)=80%,数组w=30/30+20=60%.在这两个百分值中,剩余的20%和30%就是浪费了的内存 。所以可以看见,指针需要存储的变量越大,struct指针就越占有优势,因为它为我们节约了很大的内存(当使用内存较小时我们通常对此忽略不记,但是当管理大型数据时,我们就不得不考虑这个问题,所以架构指针通常使用在管理对象(通过类建立)上 , 具体应用,你可以想一下图片处理,把每张图片当作一个结构的对象(这里的对象是变量中复制之后的常量),使用链表,就可以快速访问所有你想访问的并且存在的图片)今天耐性还不错 , 呵呵!
3,怎么理解指向二维数组的数组指针是二级指针一维数组的名其实就是指针,如int a[4]=但是二维数组 int aa[2][3]=实际上二维数组的第一维是int (*ab)[3] , 是个指针数组,不是数组指针 。这个时候int (*ab)[3]是与 int **不同的 。所以接受二维数组时要用 int (*ab)[3],不能用二级指针int**pp数组指针是int *ab[3]这种形式,ab先与[]结合 , 形成一个一维数组,这个数组的元素都是int*的指针,所以叫做数组指针 。这个时候可以用int**p=ab;是对的 。因为二级指针只能指向存有int*的位置,而数组内部都是int*的元素 。所以数组指针就是二级指针 。而二维数组不能直接作为二级指针 。它是一维指针数组int (*ab)[] 。这个指针数组解释就是首先是一个指针(*ab),然后是一个数组 , 存放int元素 。可以用这个指针ab去访问,**ab第一个元素;*(*ab)[1]第二个元素 。如果是二维数组指针int *ab[2][3];这个时候不能类推,用三级指针int***ppp=ab;是错误的 。这个时候第一维其实是int*(*a)[3],是一个指针,然后是个数组 , 存放3个int* 元素 。你不能将int*(*)[]类型直接等价于int***,理由与二维数组不能直接用二级指针表示一样 。其实说这个有点多余了 。#include void main( ) { int a[3][2]={10,20,30,40,50,60}; int (*p1)[2]=a;//表示一个指向由2个元素组成的整型数组指针,对于二维数组就是列数,指向数组a int *p2[3]={a[0],a[1],a[2]};//指针数组很容易理解 , 每个元素都是指针 int i=0; for (;i<3;i++) { printf("%d\t%d\t",p2[i][0],p2[i][1],p2[i][2]); } printf("\n"); for (i=0;i<3;i++) for (int j=0;j<2;j++) { printf("%d\t",*(*(p1+i)+j));//a[i][j] } for (i=0;i<3;i++) for (int j=0;j<2;j++) { printf("%d\t",*(p1[i]+j));//a[i][j] } for (i=0;i<3;i++) for (int j=0;j<2;j++) { printf("%d\t",p1[i][j]);//也是 } }【什么叫二级指针,二级指针的用法】

    推荐阅读