(C++)函数参数传递中的一级指针和二级指针

数据结构 无头结点的单链表 ---------------start reading--------------- 前言 头结点是用来标记单链表的一个标志,有些时候我们可以不使用头结点,这时候操作就完全不一样了。 如何建立一个无头结点的单链表?不能在头结点的数据域中放数据再变成假的第一个数据节点在进行操作,那是自己骗自己。 在单链表中我们直接头结点进行解引用,但无头结点的链表最初其实就是一个指针,没有指向任何结点,在进行插入... 阅读详情

主要内容:

1、一级指针和二级指针

2、函数指针传递的例子

3、什么时候需要传递二级指针?

4、二级指针在链表中的使用

1、一级指针和二级指针

一级指针:即我们一般说的指针,就是内存地址;

二级指针:指向指针的指针,就是地址的地址;

如:

int a=1;

int *p=&a;  // p为a变量的地址,通过*p可以得到a的值

int **q=&p;   // q为p指针的地址,通过**q可以得到a的值 

2、函数指针传递的例子

程序1:


	
#include<stdio.h>
 
void  fun(int  *p){
    int  b=100;
    p=&b;
}
 
int main(){
    int  a=10;
    int  *q;
    q=&a;
    printf("%d\n",*q);
    fun(q);
    printf("%d\n",*q);
    return  0;
}

运行结果:

10

10

程序2:

#include<stdio.h>
 
void  fun(int  **p){
    int  b=100;
    *p=&b;
}
 
int main(){
    int  a=10;
    int  *q;
    q=&a;
    printf("%d\n",*q);
    fun(&q);
    printf("%d\n",*q);
    return  0;
}

运行结果:

10

100

程序3:

#include<stdio.h>
#include<stdlib.h>
 
void  myMalloc(char  *s){
     s=(char*)malloc(100);
}
 
int main()
{
     char  *p=NULL;
     myMalloc(p);
     if(p==NULL)
        printf("P is not changed!\n");
     else{
        printf("P has been changed!\n");
        free(p);
     }
     return 0;
}

运行结果:

P is not changed!

程序4:

#include<stdio.h>
#include<stdlib.h>
 
void  myMalloc(char  **s){
     *s=(char*)malloc(100);
}
 
int main()
{
     char  *p=NULL;
     myMalloc(&p);
     if(p==NULL)
        printf("P is not changed!\n");
     else{
        printf("P has been changed!\n");
        free(p);
     }
     return 0;
}

运行结果:

P has been changed!

3、什么时候需要传递二级指针?

通过上述例子,我们可以看到,在某些情况下,函数参数传递一级指针时,在函数体内对指针做变动,也不会对原始指针产生变化,而传递二级指针时,则可以,这是为什么呢?

在传递一级指针时,只有对指针所指向的内存变量做操作才是有效的;

在传递二级指针时,只有对指针的指向做改变才是有效的;

下面做简单的分析:

在函数传递参数时,编译器总会为每个函数参数制作一个副本,即拷贝;

例如:

void fun(int *p),指针参数p的副本为_p,编译器使_p=p,_p和p指向相同的内存空间,如果在函数内修改了_p所指向的内容,就会导致p的内容也做相应的改变;

但如果在函数内_p申请了新的内存空间或者指向其他内存空间,则_p指向了新的内存空间,而p依旧指向原来的内存空间,因此函数返回后p还是原来的p。

这样的话,不但没有实现功能,反而每次都申请新的内存空间,而又得不到释放,因为没有将该内存空间的地址传递出来,容易造成内存泄露。

void fun(int **p),如果函数参数是指针的地址,则可以通过该参数p将新分配或新指向的内存地址传递出来,这样就实现了有效的指针操作。

如果觉得二级指针比较难理解,也可以通过函数返回值的形式来传递动态内存(切记不能返回栈内存),如:

#include<stdio.h>
#include<stdlib.h>
 
char* myMalloc(){
     char *s=(char*)malloc(100);
     return s;
}
 
int main()
{
     char  *p=NULL;
     p=myMalloc();
     if(p==NULL)
        printf("P is not changed!\n");
     else{
        printf("P has been changed\n");
        free(p);
     }
     return 0;
}

知道了上述这些,就不难理解上面四个小程序的执行结果了。

4、二级指针在链表中的使用

在链表或者树的操作中,也需要用到二级指针,

比如创建链表的头指针:

在初始化链表函数中,传入头指针,并在函数中为该指针分配空间,此时就应该使用二级指针,如void initLinklist(Node **head);

而在添加删除结点的过程中,我们并没有改变函数参数指针的指向,而是通过传入的指针如Node *head,找到要删除结点的位置,并未对该指针做改变,因此退出函数后,该指针无影响。

C语言不带表头结点的单链表操作 什么是链表 简单理解为链表的功能与数组功能相似用来存储数据,链表作为一种基本的数据结构在程序开发过程当中经常会使用到。对C语言来说链表的实现主要依靠结构体(可以存储多种数据类型)和指针,所以本文相关内容和程序需要有C语言当中指针和结构体的基础。 为什么使用链表 1、解决数组无法存储多种数据类型的问题。 2、解决数组中,元素个数无法改变的限制。 3、数组移动元素的过程中,要对元素进行大范围的移动,很... 阅读详情

相关推荐

C++中函数参数类型为指针的指针

在C++中,每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化。 1 参数类型是非指针情况 例如,有如下函数 void func(char a) { a = 'a'; return; } 使用如下方式调用func()函数 char b = 'b'; func(b); 此时,变量a是func()函数的形参,变量b是func()函数的实参。此时,在func()...

hou09tian的博客 1万+

二级指针做函数参数

下面围绕对指针数组的操作进行说明 第一种内存模型 #include "stdio.h" #include <stdlib.h> #include <string.h> void printArr(char** arr,int num) { if (arr == NULL)return -1; for (int i = 0; i < num; i++) { printf("%s\n", arr[i]); } } int sortArr(char** arr, int.

Arithmetic-logic 2452

自举电容的工作原理-3句话总结

1、一道面试题 照例,先抛出来一道面试题:“Buck电路的SW引脚通常会放置一颗小电容,这颗电容有什么用?”。这个问题问得比较细,非常考验被面试者的硬件基本功。 2、似懂非懂的答案 有小伙伴可能不太清楚这颗电容的作用,回答不上来。也有小伙伴脱口而出:自举电容,用来做升压的。但后面好像说不出来具体逻辑。 没具体了解过,答不上来,也没啥可惜的。但是了解过一点,但又似懂非懂的这种,给出的答案只是轻轻点水或者千篇一律,那无疑是错过了一个加分项。 3、异步Buck的自举环路组成 既然是针对Buck电路讲自举电容,前面

ltqdxl的博客 3万+

C语言(四)二级指针

目录 一、二级指针初探  二、通过二级指针间接修改一级指针指向  三、二级指针三种常见形式 四、二级指针做函数参数 输出参数 输入参数 五、三级指针用法 一、二级指针初探  #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; int main(void) { int a =...

誓约胜利之舰 1159

Kafka 系列 —(17)Kafka 流式处理:Kafka Streams架构、使用场景、框架选择

本文介绍了KafkaStreams的架构特点、应用场景及与其他流处理框架的比较。KafkaStreams作为嵌入式分布式流处理库,其核心架构包含流处理器、任务、拓扑和本地状态存储,具备自动容错和伸缩能力。适用于实时监控、ETL、聚合、Join、物化视图等低延迟场景。与Flink、Spark相比,KafkaStreams适合简单架构和微服务,而Flink适合大规模处理,Spark更适合批处理。选择框架需根据具体场景需求,如微服务推荐KafkaStreams,大规模处理推荐Flink。

moton2017的博客 1631

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1591

C:一级指针与二级指针的详解

1.指针和数组 指针是个用来存放地址的变量; &arr表示整个数组; arr数组名表示首元素的地址; 指针解引用即表示指针所指向的内容 比如:char ptr=“abcdef”; ptr; //指针解引用即表示它所指向的内容,即abcdef ptr; //ptr里保存的是字符串的地址 2.一级指针 一级指针就是指指针,里面放的就是元素的地址,我们可以通过访问元素的地址来找到该地址里存放的内...

AngelDg的博客 3468

CMMI AIM 人工智能成熟度框架:31个过程域的157项AI实践集成

CMMI AIM人工智能成熟度框架为企业提供了系统化管理AI项目全生命周期的解决方案,包含31个过程域的157项AI实践。该框架通过四个演进阶段(混沌与风险、结构与凝聚、验证与信任、价值与增长),帮助组织建立可持续的AI能力成长路径,降低项目失败率并提升商业价值。

weixin_42613501的博客 353

C 函数参数传递一级指针和二级指针的区别

一、概念 1、一级指针和二级指针 指针保存的只是地址,这一点不用忘了 一级指针:指向变量的指针,保存的是该变量的地址; 二级指针:指向一级指针的指针,保存的也是地址,这个地址是一级指针变量的地址; 如: int a = 1; int* p = &a; //一级指针,p保存的是变量a的地址,*p 是取到变量a 的值 int** _p = &p; //二级指针,_p保存的一级指针变量p的地址,*_p 取到的是一级指针变量p的地址,**_p 取到一级指针p所指向地址的值(这里**_p 的

qq_37382732的博客 2195

雨流计数法的matlab实现,采用三点法与四点法

介绍雨流计数法是20世纪50年代由英国的两位工程师M.Matsuishi和T.Endo提出来的。该计数法的主要功能是把实测载荷历程简化为若干个载荷循环,供疲劳寿命估算和编制疲劳试验载荷谱使用。它以双参数法为基础,考虑了动强度(幅值)和静强度(均值)两个变量,符合疲劳载荷本身固有的特性。雨流计数法主要用于工程界,特别在疲劳寿命计算中运用非常广泛计数规则(1)雨流依次从载荷时间历程的峰值位置的内侧沿着...

u011391128的博客 3万+

ADC(三)Guard ring的设计艺术:从单元到系统的隔离策略

本文深入探讨了ADC设计中Guard ring(保护环)从单元到系统的多层次隔离策略。文章分享了从新手到专家的认知升级过程,详细分析了在单元内部进行微隔离、在模块间建立噪声屏障以及在系统层面规划全局隔离带的实用方法与设计艺术,强调了Guard ring对于提升混合信号电路性能和可靠性的关键作用。

weixin_28312391的博客 152

C/C++什么时候使用二级指针,你知道吗?

以前就遇到函数参数是指针,想要修改指针,结果总是不理想,前几天群里也是有萌新问到这个问题,刚好我当时在书上看到怎么一句话:==函数参数是按值传递和按引用传递==,瞬间就顿悟了这个问题。这是以前发现问题时写的,只写了解决方法,并没有说明其中原因,其实是当时还是不知原因的,俗话说:知其然,知其所以然,刚好顿悟了这个原因,就记录一下下吧,文章想到最后,感觉做一个图比较有

花狗Fdog的博客 1万+

基于深度学习的野生菌菇检测识别分类系统(YOLOv8 + UI界面 + 数据集)

随着深度学习技术的迅猛发展,计算机视觉领域的应用得到了广泛的关注。野生菌菇的检测与识别是一个复杂而又有趣的问题,涉及到物体检测、图像分类以及自然语言处理等技术。本文将介绍如何基于YOLOv8模型,结合自定义UI界面与数据集,构建一个高效且精确的野生菌菇检测识别分类系统。首先,我们将介绍YOLOv8的原理与特点,然后详细描述如何构建和训练野生菌菇识别模型,并介绍如何为该系统设计UI界面,最终形成一个完整的系统。本文内容包括代码实现、模型训练及数据集准备等,旨在为有类似需求的开发者提供参考和帮助。目录摘要目录。

YOLO 1547

C语言一级指针、二级指针(看这篇就够了)

从上面代码我们看出来,一开始我们的ptr指针,指向的数据是num1的地址,但是现在如果我想要他指向num2,则我就必须把num2的地址赋值给ptr,而函数内部,如果你想修改外部的指针的指向。结果好家伙,你倒好,你到了小明家,把人家东西偷了,最后被抓了,你还说是我指示你这么干的。在单片机内部,用不同的数据类型,每个数据类型占用的内存空间不尽相同,当我们在执行函数的时候,学过C语言的都知道,这个时候,你可能会想,那不久完事了,我的目的达到了,我改变了ptr的指向,以后你想要获取新指向的内存空间的数据。

qq_19343801的博客 1527

Android Audio录音——AudioRecord回声消除(九)

在语音通话或录音场景中,回声(Acoustic Echo)通常是指说话的声音从对方的扬声器播放出来,又被对方的麦克风拾取,然后有被传回来,导致我们听到了自己延迟了一段时间的重复声音。

小旭的专栏 1404

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C语言】函数参数传递中的一级指针和二级指针

而在添加删除结点的过程中,我们并没有改变函数参数指针的指向,而是通过传入的指针如Node *head,找到要删除结点的位置,并未对该指针做改变,因此退出函数后,该指针无影响。void fun(int *p),指针参数p的副本为_p,编译器使_p=p,_p和p指向相同的内存空间,如果在函数内修改了_p所指向的内容,就会导致p的内容也做相应的改变;通过上述例子,我们可以看到,在某些情况下,函数参数传递一级指针时,在函数体内对指针做变动,也不会对原始指针产生变化,而传递二级指针时,则可以,这是为什么呢?

qq_43331089的博客 1834

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言中的指针:一级指针与二级指针

在C语言中,指针是一个变量,其值为另一个变量的内存地址。指针提供了对内存的直接访问能力,使得程序更加灵活和高效。每个指针都有一个类型,这个类型决定了指针所指向的数据类型。C语言中的指针是理解和掌握这门编程语言的关键之一。一级指针用于指向具体的变量,而二级指针则可以进一步指向其他指针,从而提供更复杂的数据结构管理和操作的能力。通过正确的引用和解引用,我们可以编写出高效的代码,充分利用计算机的资源。

z939188380的博客 1581

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

指针在C/C++中的魔力:一级指针与二级指针

指针是一个变量,它的值是另一个变量的地址。在C/C++中,指针是一个强大的工具,可以让我们直接操作内存地址。指针的主要用途包括动态内存分配、数组和字符串处理、函数参数传递等。定义一个指针时,我们使用来表示它指向的变量类型。int a = 10;// p 是一个指向 int 类型变量的指针int *p声明了一个指向int类型变量的指针p。&a是操作符,用于获取变量a的地址,并将其赋给指针p。我们可以通过指针p访问和修改a// 输出: a = 10*p = 20;// 输出: a = 20。

点云兔子的博客 983

有关一级指针和二级指针的归纳总结

计导课讲到指针和动态内存分配,这里真是一个难点,很多概念容易混淆,有时候一个概念要查阅好多网站,看过很多博文才能理解,不过学习编程不就是这样嘛~~一定要想办法理解才行,所以今天归纳了关于一级指针和二级指针的知识供大家学习(中间有一些摘录,不太记录来源,如果有涉及到哪位仁兄的文章,请跟我说,我会加上来源链接哒~)(http://blog.youkuaiyun.com/bearray123/article/det

Peggy_Chang的博客 3333

二级指针与函数参数

二级指针做函数参数

优快云GuoYuying的博客 1624

C 语言二维数组与二级指针的深度剖析

二级指针是指向指针的指针。例如,int **p定义了一个二级指针p,它可以存储一个指向int类型指针的地址。二级指针在处理复杂的数据结构、动态内存分配以及函数参数传递等方面非常有用。它提供了一种间接访问和操作数据的方式,可以通过多次解引用来访问最终的数据。C 语言中的二维数组和二级指针是强大但又需要谨慎使用的工具。理解它们的本质、关系和正确使用方法,可以帮助我们编写更加高效、可靠的 C 语言程序。

千千道的博客 1809

函数参数的传递问题(一级指针和二级指针)

(1)概念 一级指针:即我们一般说的指针,就是内存地址; 二级指针:指向指针的指针,就是地址的地址; 例如: int a=1; int *p=&a;  // p为a变量的地址,通过*p可以得到a的值 int **q=&p;   // q为p指针的地址,通过**q可以得到a的值 (2)指针参数传递的示例 (A)sample 1 #include<stdio.h> void fun(int *p){ int b=100; p=&b; }

Flying snow 915
上一篇: 二级指针和指针引用函数传参(C++)
下一篇: 为p指向空间赋值
like_study_cat
博客等级 码龄7年 44粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值