函数参数当中的一级指针和二级指针

全面地理解为什么在C语言中使用`malloc`分配内存时需要二级指针。 C语言中使用malloc分配内存时需要二级指针。 阅读详情

函数参数当中的一级指针和二级指针

在C语言中,是否需要使用二级指针取决于你想要对指针本身还是指针所指向的内容进行操作。


1. 为什么需要二级指针?

当你需要修改指针本身的值(例如,改变指针指向的地址)时,需要使用二级指针。这是因为函数参数传递是按值传递的,如果直接传递一个指针,函数内部对指针的修改不会影响到调用者传递的原始指针。


2. 一级指针 vs. 二级指针

  • 一级指针(Type \*ptr):
    • 用于操作指针所指向的内容。
    • 如果你只需要读取或修改指针所指向的内存区域,而不需要改变指针本身的值,传递一级指针即可。
  • 二级指针(Type \**ptr):
    • 用于修改指针本身的值。
    • 如果你需要在函数内部分配内存,并将分配的地址传递回调用者(即修改调用者传递的指针),需要使用二级指针。

3. 具体例子

修改指针本身(需要二级指针)
void allocate(int **ptr, int size) {
    *ptr = (int *)malloc(size * sizeof(int));
}

int main() {
    int *arr = NULL;
    allocate(&arr, 10);  // 使用二级指针传递arr
    // arr现在指向分配的内存
    free(arr);
    return 0;
}
修改指针所指向的内容(只需要一级指针)
void fill_array(int *ptr, int size, int value) {
    for (int i = 0; i < size; i++) {
        ptr[i] = value;
    }
}

int main() {
    int arr[10];
    fill_array(arr, 10, 42);  // 只需要一级指针
    // arr的内容被填充为42
    return 0;
}
函数参数的传递问题(一级指针和二级指针) 深入阐述一级指针和二级指针的概念,解决函数传递时值传递和引用传递带来的困惑 立即下载

相关推荐

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1401

C语言指针传参详解:一级指针与二级指针

i < sz;i++) {一级指针传参用于处理一维数组,函数可以接收指向数组首元素的指针。二级指针传参用于处理指向指针的指针,适用于存储一级指针的数组等情况。通过理解指针传参的不同方式,程序员能够更灵活地处理各种数据结构,提高代码的可维护性和可扩展性。选择正确的指针级别传递参数有助于更好地设计和组织代码。

2302_78381559的博客 1047

ImageNet分类实战:用PyTorch复现AlexNet的5个关键技巧(附代码)

本文详细介绍了使用PyTorch复现经典AlexNet模型进行ImageNet图像分类的五个关键工程技巧。内容涵盖模型架构的现代重构、训练策略优化、核心组件实现与替代方案,以及实用的训练调试方法,并提供了完整的代码示例,帮助开发者深入理解深度卷积神经网络的实现细节与优化思路。

i0j1k2l3m的博客 94

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

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

qq_43331089的博客 1834

Unity中5自由度机械臂运动控制与夹爪交互仿真实践

本文详细介绍了在Unity中实现5自由度机械臂运动控制与夹爪交互仿真的完整流程。从模型导入、物理组件配置到关节运动控制算法(包括逆运动学IK),再到夹爪抓取逻辑和工业分拣案例实战,提供了可落地的代码示例与性能优化方案,助力开发者快速掌握机械臂仿真核心技术。

weixin_29021757的博客 446

告别OFDM卡顿:用MATLAB手把手仿真AFDM波形,搞定高铁、无人机通信的时变信道难题

本文详细介绍了如何使用MATLAB仿真AFDM波形,解决高铁和无人机通信中的时变信道难题。通过仿射变换技术,AFDM在多普勒频移严重的场景下表现优异,显著提升通信质量。文章包含参数配置、波形生成、性能对比等实战内容,适合通信工程师和研究人员参考。

weixin_27014595的博客 318

c语言一级指针与二级指针的传参的区别

二级指针是存储了一级指针的地址,如果仅仅传递一级指针只会获得一级指针的拷贝,而不会对原函数中传入的一级指针改变,如果想要改变必须用一个return 一级指针进行接受, 因此 在传参为一级指针的情况下,函数类型是一级指针 但如果,传参在二级指针的情况下,函数类型就可以是void型 换句话说,指针的使用就相当于让函数不仅仅只有一个返回值。 ...

m0_62745577的博客 1006

永磁同步电机高效标定技术:从理论到实践的全面解析

本文全面解析永磁同步电机高效标定技术,从MTPA标定、弱磁区优化到初始角校准,详细介绍了理论原理和实战技巧。针对新能源汽车应用场景,提供标定系统集成要点和AI辅助优化方案,帮助工程师提升电机性能标定效率与精度。

weixin_28452161的博客 503

C语言-一级指针与二级指针的详解(图文并茂,深入浅出)

高清音视频文件由H.264视频和AAC音频合成;采用FFmpeg解码库对音视频文件进行格式封装解码;采用硬件分别对音频、视频进行解码;最后,实现音视、视频的同步播放。其整体解决方案如下图: ...

Xminyang的博客 7753

MTK手机传感器驱动开发避坑指南:从SCP代码大小限制到Overlay加载流程详解

本文详细解析了MTK平台传感器驱动开发中的常见问题,包括SCP代码大小限制、Overlay加载流程及客制化传感器集成。通过实战案例和优化策略,帮助开发者高效解决MTK传感器驱动开发中的技术难题,提升开发效率。

weixin_42522374的博客 401

单片机应用案例:ESP32 搭配 BH1750 光强传感器和 Web 服务器

在该应用案例中,我们将使用 ESP32 开发板作为主控制器,BH1750 光强传感器用于采集环境光强度数据,并通过 Web 服务器展示采集到的数据。步骤一:购买材料步骤二:连接硬件步骤三:编写代码我们将使用 Arduino IDE 编写代码,以下是主要代码:// WiFi 设置const char* ssid = “你的 WiFi 名称”;const char* password = “密码”;// Web 服务器实例// BH1750 实例// 获取当前光强度数据。

RlDart的博客 813

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

Python 实战:爬取高德地图交通数据(路况拥堵指数分析)

高德地图是由高德软件有限公司开发的一款地图导航产品,提供详细的地图浏览、路线规划、实时路况、公共交通查询等功能。高德地图拥有庞大的用户群体和海量的交通数据,这些数据对于交通管理、城市规划、出行服务等领域具有重要的价值。通过对高德地图交通数据的分析,我们可以了解城市交通的运行状况,识别拥堵路段,预测交通流量,为交通管理部门和出行者提供决策支持。

yansideyucsdn的博客 2685

一级指针和二级指针做函数参数的区别

上面说到,在func2内输出的&x和 main中的&b不相等,在退出func2后,形参int* x的内存被释放,如果我们在func2内部改变形参指针x本身的值,也就是改变他的指向,main中实参b的值会不会改变呢?答案是否定的,我们来验证一下。一级指针做函数参数,传入的是原来指针的副本,也就是形参的地址和原来实参地址是不同的,但形参和实参的值(也就是指向的地址一样),所以可以在函数内部改变指向地址所存储的变量。二级指针做函数参数,仍然无法改变指针本身的值,但是可以改变二级指针指向的一级指针的指向。

weixin_41989343的博客 349

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

c语言二级指针malloc,c语言的一级指针和二级指针作为函数参数,链表,malloc中的分配等等总结...

主要内容:1、一级指针和二级指针2、函数指针传递的例子3、什么时候需要传递二级指针?4、二级指针在链表中的使用1、一级指针和二级指针一级指针:即我们一般说的指针,就是内存地址;二级指针:指向指针的指针,就是地址的地址;如:int a=1;int *p=&a;  // p为a变量的地址,通过*p可以得到a的值int **q=&p;   // q为p指针的地址,通过**q可以得到a的值...

weixin_39606244的博客 947

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

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

c函数参数中的一级指针和二级指针作用区别

常见的一级指针参数 先来看一个最常用函数模型,函数func()参数为一个uint8_t 的指针类型,那这个函数有什么作用? uint8_t data1[3]; void func(uint8_t *p) { p[0]=0x01; p[2]=0x02; } void main() { uint8_t *p1=data1; func(data1); } 在main函数中先定义了一个指针p1,然后把p1指向了一个数组data1。 把p1作为参数传递进函数func() 结果也很容易猜到,就是data1中

DK45 695

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

主要内容: 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.

like_study_cat的博客 603

一级指针和二级指针作函数参数

编译器总是要为函数的每个参数制作临时副本!!!一级指针作函数参数,不能改变实参的指向。(拷贝出一个指针变量,他们的内容一样即指向同一片内存,只能操作指针对应的内存)二级指针作函数参数,可改变实参的指向。(拷贝了一级指针变量的地址,所以可以操作一级指针)同理,想操作K级指针,必须以K+1级指针作为形参...

qq_25167815的博客 356

c语言中一级指针和二级指针做函数参数

以前刚接触c语言没多久时,碰到涉及到一位数组、二维数组、一级指针、二级指针、指向一位数组的指针、指针数组、函数指针等的函数时就搞晕了,不知道怎么设计函数参数,调用这类函数的时候也是不知道怎么给函数传递参数。 这里为了让读者看得更加明白,我先给大家回顾下一些概念,方便后面的概念解释。 1. 一维数组的名字代表的是第一个元素的地址,加 1 就是下一个元素的地址,二维数组的名字代表的是第一行的地

生命的紫金颜色 2923

C++一级指针和二级指针

一级指针 通常用作函数的输入参数,因为一级指针作为函数参数,在调用的时候,实参和形参是不同的内存空间,只是,这个内存空间存放的指针指向的是同一块地址,所以形参在函数执行中可以访问实参指向的内存空间,但是形参的指向的改变并不能影响实参。 总结一句话:一级指针做函数参数, 在函数内做形参做重新指向并 不会影响实参的指向。 一级指针需要注意的问题: 1、不要在函数中,改变形参的指向来达到改变实参指向的效...

py826826的博客 1107

c语言二级指针的作用,c函数参数中的一级指针和二级指针作用区别

先来看一个最常用函数模型,函数func()参数为一个uint8_t 的指针类型,那这个函数有什么作用?uint8_t data1[3];void func(uint8_t *p){p[0]=0x01;p[2]=0x02;}void main(){uint8_t *p1=data1;func(data1);}在main函数中先定义了一个指针p1,然后把p1指向了一个数组data1。把p1作为参数传递...

weixin_39702483的博客 203

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

原以为自己对指针掌握了,却还是对这个问题不太明白。请教!  程序1:  void  myMalloc(char  *s)  //我想在函数中分配内存,再返回  {       s=(char  *)  malloc(100);  }   void  main()  {       char  *p=NULL;       myMalloc(p);    //这里的p实际还是NULL,p的值没有改变

1909
上一篇: Bios命令行和Linux命令行
彦祖学嵌入
博客等级 码龄4年 91粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值