二级指针概念和作用
c吧
全部回复
仅看楼主
level 5
本文由西安恩仪联教育科技有限公司研发部整理和发布,如要引用请注明出处,尊重原版。
目录:
1、二级指针概念。
2、二级指针的作用。
一、什么是二级指针。
大多数学习的c语言的初级开发者或多或少都听过这个概念,但是实际项目中较少使用。这主要原因还是大家的项目经验比较少,接触的项目没有到一定的规模。在企业级开发者的眼里这也是一个普通的概念,是一个常用的技术点,要提高自己的编程能力和开发水平就必须要掌握该技能点。
1、何为二级指针?
c语言书中给的定义是:指向指针的指针。这句话由于比较抽象导致很多人都不理解,究竟什么是二级指针。用大白话来表述这个定义的意思是:指针指向的空间中不存放数据,存放另一个内存单元的地址,这个指针就称为二级指针。
什么指针才是二级指针,举例说明一下。很多人都列举不出例子说明这个问题。这里给出两个案例说明什么是二级指针,
案例1:指针变量的地址是一个典型的二级指针。
如下代码:
Int data = 0;
Int *p = &data;
&p是一个典型二级指针,符合上面给出的定义。内存分布图如下:
内存分布图
其中0x7f008820是变量data的地址,p是一个指针变量,p指向了data,即p中存放了data的地址0x7f008820。那么指针变量的地址0x8f007723就是典型的二级指针。
案例2:指针数组名是一个典型的二级指针。
指针数组是一个数组,数组每一项存放的是指针,不是数据。指针数组名代表数组的起始地址,所以符合定义,是一个典型的二级指针。大家仔细考虑一下,指针数组每一个元素的地址都是二级指针。
2、二级指针语法规则
大家注意,指针是手段,是工具。大家的目的是操作数据,通过指针操作内存中的数据。不管是一级指针还是二级指针目的都是为了操作数据。通过二级指针变量操纵数据的语法规定如下:
定义二级指针变量语法:
类型名 **指针变量名 = NULL;
例如:
Int **q = NULL;
q可以存放一个整型指针变量的地址,即q是一个二级指针变量。通过q操作数据同样需要三个步骤:定义、指向和使用。
int data = 0;Int *p = &data;Int **q = NULL;//定义q = &p;//指向**q = 23;//使用二级指针存放数据
上一句等价于:*p = 23 和 data = 23,这三句的意思完全一致。
二、二级指针作用
学习技术点的目的是使用该技术点,如果学习完了发现没有什么作用,或者找不到合适的案例证明它的价值和意义。则证明大家没有学懂,或者说只知其一不知其二,似懂非懂,仍然不会用。
使用场景1:指针数组名是一个典型的二级指针,所以当指针数组名作为函数的参数时,其对应的形式参数是一个典型的二级指针变量。
Char *strs[5] = {“mike”,”lucy”,”jack”,”lili”,”jule”};
调用函数fun传递strs给该函数
fun(strs,5);
函数fun的定义如下:
Void fun(char **strs,int count)
{
函数体
}
设计函数fun需要理解二级指针的概念和使用方法。
使用场景2:在动态分配内存空间时,两级存空间分配时需要使用二级指针。例如利用指针数组处理多个字符串,空间分配方案如下:
方案1:指针数组空间静态分配,存放字符串的空间动态分配,代码如下:
char *strs[5] = {NULL};for(int i = 0;i < 5;i++){ strs[i] = (char*)malloc(sizeof(char) * 30); memset(strs[i],0,sizeof(char) * 30);}
内存分布图如下:
方案2:为了节省栈中的空间,将指针数组的空间也采用动态分配方式,在堆中开辟空间;同时存放字符串空间也在堆中分配。
char **strs = NULL;strs = (char **)malloc(sizeof(char *) * 5);for(int i = 0;i < 5;i++){ *(strs+i) = (char*)malloc(sizeof(char) * 30); memset(*(strs+i),0,sizeof(char) * 30);}
内存分布图:
方案2的方式节省了栈空间,在堆空间中进行了两级分配,给指针数组分配空间,然后再给字符串分配空间。采用此种方案需要使用二级指针。
2025年08月21日 09点08分 1
1