C语言:二级指针的作用

二级指针的作用用处特别大!!!

首先主要在数据结构之中当改变指针的时候就需要通过改变指针的指针的值来改变!

在数据结构中用处很广.最普遍的比如说链表,通过调用函数改变了链表中的元素,那么整个链表就发生了变化,这种情况下就会用到二级指针,因为链表的起始是通过指向头结点的指针来执行的,所以必须要改变这个指针,怎么样使一个指针改变?在形参传递时,必须传递指针的地址,也就是指向指针的指针.

指向指针的指针的作用 :当要修改实参指针的指向的时候,形参必须使用指向指针的指针。

当修改的是实参指针指向的内容时,则形参只需是指针即可

以下是经典程序(载自林锐的从c\c++高质量编程),讲解的部分是我个人理解

复制代码
void GetMemory(char *p,int num)
{
      p=(char*)malloc(sizeof(char)*num);       //p是形参指向的地址
}
void main()
{
      char *str=NULL;
      GetMemory(str,100);                            //str是实参指向的地址,不能通过调用函数来申请内存
      strcpy(str,"hello");
}
复制代码

 

结构是编译能通过,却不能运行,为什么呢?

先说一下指针作为函数参数的意义:当将指针作为参数时,实参向形参传递的是地址,在函数执行过程中,既可以对该参数指针进行处理,也可以对该参数指针所指向的数据进行处理,(以上程序段来说就是可以对p或*p进行处理)。由于此时形参和实参都是指向同一个存储单元,因此当形参指针所指向的数据改变时,实参指针所指向的数据也作相应的改变,因此这时的形参可以作为输出参数使用。(str和p应同时更改!)

按照上面的说法,这个程序应该没有问题的啊,实参str和形参p指向同一个存储单元,给形参分配的内存单元应该也给实参分配了才对啊,问题就是在这里

实参和形参是指向同一个地址,它们只是指向相同,但它们自身的地址不是同时申请的,就是说p在申请内存时,相当于是把p的指向给改了,但是str的指向仍然没有改!所以尽管str调用了GetMemory,但它仍然是个空指针,所以进行strcpy是就不能运行。

要使程序可以运行,只要小小的改动就行了(用指向指针的指针):

复制代码
void GetMemory(char **p,int num)
{
  *p=(char*)malloc(sizeof(char)*num);       //此时*p就变成了是形参本身的地址
}
void main()
{
  char *str=NULL;
  GetMemory(&str,100);                            //&str是实参的地址,所以实参和形参之间就可以直接调用
  strcpy(str,"hello");
  free(str);
}
复制代码

程序就会如你所愿,输出hello了

嵌入式软件设计
 


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(3300)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2019-11-06 建造者模式:建造者模式的一些使用小结
2019-11-06 android studio: 快捷键生成getter/setter方法时自动加m的问题
2019-11-06 Socket: java Socket的isConnected()、和isClosed()判断是否在线的问题(转)
2016-11-06 新浪微博客户端(19)-显示刷新的最新微博数量
点击右上角即可分享
微信分享提示