二级指针的作用详解

二级指针的作用详解一 概念在如下的 A 指向 B B 指向 C 的指向关系中 首先 C 是 一段内容 比如你用 malloc 或者 new 分配了一块内存 然后塞进去 一段内容 那就是 C 了 C 的起始地址是 0x00000008 B 是一个指针变量 其中存放着 C 的地址 但是 B 也要占空间的啊 所以 B 也有地址 B 的起始地址是 0x00000004 但是 B 内存中存放的是 C 的地址 所以 B 里面的内容就是 0x00000008 那么到此

首发于微信公众号:【码农在新加坡】,欢迎关注。

个人博客网站:二级指针的作用详解

一、概念

在如下的A指向B、B指向C的指向关系中:

首先

C是”一段内容”,比如你用malloc或者new分配了一块内存,然后塞进去”一段内容”,那就是C了。C的起始地址是0x00000008。

B是一个指针变量,其中存放着C的地址,但是B也要占空间的啊,所以B也有地址,B的起始地址是0x00000004,但是B内存中存放的是C的地址,所以B里面的内容就是0x00000008。

那么到此为止都比较好理解:

B= 0x00000008; //B的内容 *B = "一段内容"; //B解引用,也就是B指针指向的C的值 &B = 0x00000004; //B取地址,B的地址是0x00000004

那么,再来看A:

A是二级指针变量,其中存放着B的地址0x00000004,A也有地址,是0x00000000;

*A = B= 0x00000008; //A解引用也就是B的内容 A = *B = "一段内容"; //B解引用,也就是B指针指向的C的值 A = &B = 0x00000004; //A存的是B的地址,B的地址是0x00000004 &A = 0x00000000; //A取地址

二级指针的作用详解

二、使用

二级指针作为函数参数的作用:在函数外部定义一个指针p,在函数内给指针赋值,函数结束后对指针p生效,那么我们就需要二级指针。

看看下面一段代码:有两个变量a,b,指针q,q指向a,我们想让q指向b,在函数里面实现。

1.先看看一级指针的实现

#include 
  
    using namespace std; int a= 10; int b = 100; int *q; void func(int *p) { cout<<"func:&p="<<&p<<",p="< 
      

这么写有什么问题?为什么*q不等于100?我们看一下输出便知:

&a=0032F000,&b=0032F004,&q=0032F228
*q=10,q=0032F000,&q=0032F228
func:&p=0018FD24,p=0032F000
func:&p=0018FD24,p=0032F004
*q=10,q=0032F000,&q=0032F228








我们看输出:

note:1->a,b,q都有一个地址.

note:2->q指向a.

note:3->我们发现参数p的地址变了,跟q不一样了,是的参数传递是制作了一个副本,也就是p和q不是同一个指针,但是指向的地址0x0032F000(a的地址)还是不变的.

note:4->p重新指向b.

note:5->退出函数,p的修改并不会对q造成影响。

结论:

编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 p,编译器使 p = q(但是&p != &q,也就是他们并不在同一块内存地址,只是他们的内容一样,都是a的地址)。如果函数体内的程序修改了p的内容(比如在这里它指向b)。在本例中,p申请了新的内存,只是把 p所指的内存地址改变了(变成了b的地址,但是q指向的内存地址没有影响),所以在这里并不影响函数外的指针q。

这就需要二级指针操作:

2.二级指针操作

#include 
  
    using namespace std; int a= 10; int b = 100; int *q; void func(int p) //2 { cout<<"func:&p="<<&p<<",p="< 
      

这里只改了三个地方,变成传二级指针。我们再看:

因为传了指针q的地址(二级指针p)到函数,所以二级指针拷贝(拷贝的是p,一级指针中拷贝的是q所以才有问题),(拷贝了指针但是指针内容也就是指针所指向的地址是不变的)所以它还是指向一级指针q(*p = q)。在这里无论拷贝多少次,它依然指向q,那么*p = &b;自然的就是 q = &b;了。

3.再看一个例子:

我们代码中以二级指针作为参数比较常见的是,定义了一个指针MyClass *ptr=NULL,在函数内对指针赋值*ptr=malloc(…),函数结束后指针依然有效.这个时候就必须要用二级指针作为参数func(MyClass p,…),一级指针为什么不行上面说了。

void my_malloc(char s) { *s=(char*)malloc(100); } void main() { char *p=NULL; my_malloc(&p); //do something if(p) free(p); } 

<全文完>

欢迎关注我的微信公众号:码农在新加坡,有更多好的技术分享。

 个人博客网站:二级指针的作用详解 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200321.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午11:04
下一篇 2026年3月20日 上午11:04


相关推荐

  • Multipass入门教程

    Multipass入门教程一款极好用的轻量级 Ubuntu 虚拟机 Multipass 它是一款没有冗余且占内存的图形界面的命令行工具

    2026年2月20日
    0
  • Ogre1.7.2 + CEGUI0.7.5配置[通俗易懂]

    Ogre1.7.2 + CEGUI0.7.5配置[通俗易懂]转载请说明出处!http://blog.csdn.net/zhanghua1816/article/details/6650509鉴于现在很多朋友开始学习研究Ogre或者CEGUI,不过很多朋友对如何配置这两个环境有很多问题,所以我把配置方法在此简单介绍一下,希望对大家有用,分享是一种快乐,大家共同进步嘛~~~。我这里的这种方法可能不是最简单的配置方法,但是我相信这种配置方法或许对

    2022年7月24日
    12
  • Fluentd配置

    Fluentd配置FluentdFluen 是完全开源免费的日志收集系统 支持在超过 125 种不同类型的系统上收集日志 其系统示意图如下 安装第一步 RPM 包安装在 RedHat CentOS6 764 位系统上可以用下列方式安装 curl Lhttps toolbelt treasuredata com sh install redhat td agent3 sh sh 第二步 启

    2026年3月20日
    2
  • PXE部署

    PXE部署笑洋仟博客园首页新随笔联系订阅管理随笔-51文章-0评论-0阅读-2177PXE高效批量网络装机阅读目录(Content)一、PXE概述 1、PXE(PrebooteXcutionEnvironment)的概念 2、PXE批量部署的优点 3、部署PXE远程安装服务 4、搭建PXE远程安装服务器 二、搭建PXE远程安装服务器的步骤 1、安装启用TFTP服务 2、安装启用DHCP服务  …

    2022年6月29日
    27
  • java反编译工具那个好用_Java反编译工具有哪些,Java反编译工具好用推荐

    java反编译工具那个好用_Java反编译工具有哪些,Java反编译工具好用推荐下载站进行下载 Java 反编译工具 JAD 是一个非常广泛使用的 Java 反编译工具 我们可以使用 Jadcliish 使用来班长我们进行 midlet 的相关信息 那么我们可以在数据中迅速提取我们需要的数据二 JD GUI 是用 C 开发的 Java 反编译器 它由 PavelKouznet 开发 支持三个平台 Windows Linux 和 AppleMacOS 它在 Eclipse 平台下提供插件 JD Eclip

    2026年3月17日
    1
  • 创建外部用户_外部表

    创建外部用户_外部表

    2022年4月3日
    56

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号