双重指针的用法
来源:互联网 发布:个人网站域名名字 编辑:程序博客网 时间:2024/05/17 22:52
前言
1、本人QQ – 330952038 欢迎一起学习交流。
2、指针一直都是C语言的灵魂,我们平常用得最多的是一维指针,而双重指针用得相对较少,本文是对二维指针进行一个学习。
首先看一道习题:
char GetMemory(char *memorystr,u8 num){ memorystr = (char*)malloc(num);}int main(void){ char *str = NULL; GetMemory(str,6); memcpy(str,"china",5);}
请问上面代码,可以为str开辟一个空间并且把”china” 拷贝到其中吗?
分析:
要了解这个问题,我们需要先了解函数调用的过程:
1)首先把实参的值赋给形参,然后把控制流转到被调用函数。
2)执行被调用函数。
注意形参改变是不会影响到实参的值。我们再分析GetMemory(str,6),实参是一个空指针str,形参为memorystr,调用时,把str赋给memorystr,然后执行memorystr = (char*)malloc(num);,这时候 memorystr获得了6个char空间,但是因为形参改变不会影响到实参的值,str的值并没改变,还是NULL,所以上面拷贝不成功。
我们根据下图来说明:
ps: 我们平常使用指针把参数从函数中传递出来,传递的是指针所指向的内容,而非指针本身,而上的例子企图改变的是指针本身。
如果例子想达到目的,该怎么改呢? 我们可以使用双重指针实现。所谓双重指针,也称为二维指针,声明形式
类型名 **指针名, eg: char **p, 含义是指向指针的指针。
如下图:
char **p = “123”:
1)首先申请了一个空间,我们假设地址为a,a地址内容是p,p是一个二级指针,指向以p为地址的空间,则其内容为*p。
2)*p时一个一级指针,指向以*p为地址的空间,该空间存储的是”123”
3)引用二级指针,修改*p 的值就可以改变二级指针(**p)所指向的地址。通过函数参数形式修改指针地址,一般使用二级指针。
eg:
char **p =”123” , *a = “456”; *p = a; 这时候,**p指向的内容是“456”
根据这些知识,我们修改上面的例程,以实现其功能:
char GetMemory(char **memorystr,u8 num)// 使用二级指针{ *memorystr = (char*)malloc(num);// 这里是赋值给*memorystr }int main(void){ char *str = NULL; GetMemory(&str,6);// 取str的地址 memcpy(str,"china",5);}
分析:
1、GetMemory(&str,6);// 取str的地址,赋给了二级指针memorystr, 那么*memorystr就是取&str地址的内容,即str,两者完全等价。如果*memorystr改变,那么str也会改变。
2、*memorystr = (char*)malloc(num);// 申请num个char空间给*memorystr,也就是给str申请了num个char空间。
3、最后把字符串copy到china 中。
- 双重指针的用法
- 双重指针的用法
- 双重指针的用法
- 关于双重指针的用法
- 双重指针的疑惑
- 双重指针的使用
- 双重指针的使用
- 双重指针
- 双重指针
- 双重指针
- 双重指针
- 双重指针
- 双重指针变量的定义和使用
- 双重指针做函数参数的意义
- 初次学习双重指针的心得
- 解引用指针的双重间接
- 关于数组指针,指针数组,双重数组,二维矩阵,字符串数组,双重字符指针的理解
- 为什么使用双重指针
- Java注解的部分实现:动态代理
- iOS常用加密方法(aes、md5、base64)
- Openstack Swift 原理、架构与 API 介绍
- Javascript闭包(Closure)
- 51nod 1272 最大距离 (单调栈)
- 双重指针的用法
- h264协议帧头数据解析
- Xamarin 免费了,你能做什么?
- BZOJ1787: [Ahoi2008]Meet 紧急集合(LCA)
- LeetCode *** 94. Binary Tree Inorder Traversal
- listview一键返回顶部悬浮按钮
- 友元函数第一次运用输出时间值
- sklearn基础知识-准备阶段
- iOS 键盘遮挡问题