0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言函数不改变形参内容的说明

聚丰开发 2018-10-29 11:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

注:本文是作者以前发表在其个人博客,现在发布到“聚丰开发”专栏


这也是面试时常碰到的题,通常是把一个指针作为函数的输入参数,在函数内部会改变输入参数对应的指针,问面试者在函数调用过程中指针的具体内容。


这里我也设计一个这样的函数,功能是对输入参数指定的地址连续写入指定个数的指定内容。问在位置(1)(2)(3)指针p的值,在位置(4)(5)指针 buf的值。



答案是:


位置(1)指针p还没赋值为空指针0
位置(2)(3)指针p的值均为&data_buf[0]
位置(4)针buf值为&data_buf[0]
位置(5)指针buf值为&data_buf[100]

void fill_buffer(unsigned char* buf,unsigned char data,unsigned char size)
{ //位置(4)
unsigned char i;
for(i=0;i {
*buf=data;
buf++;
}
}//位置(5)

void main(void)
{
unsigned char data_buf[256];
unsigned char *p;
p=(char*)data_buf; //位置(1)
fill_buffer(p,0,100); //位置(2)
while(1); //位置(3)
}


可能有的人会疑惑,明明指针p作为函数的参数,在函数中有进行递增操作,为什么函数返回后在位置三还是保持内容为&data_buf[0]不变?


有这种想法的人理解的逻辑流程如下,看上去也好像有道理。


void main(void)
{
unsigned char data_buf[256];
unsigned char *p;
p=(char*)data_buf;
fill_buffer(p,0,100); p在这里是输入参数
//unsigned char i;
//for(i=0;i //{
// *p=data;
// p++; 执行到这里不就是改变了p吗?
//}
while(1); 函数返回p应该也改变了
}


这种理解自然不对,对于函数的参数,不能简单的在函数中进行替代理解,以这里的fill_buffer(p,0,100)为例子,函数中并不会对p进行任何处理,而是先将p的值用一个临时变量保存起来(也可以为寄存器),在函数中使用的是这个临时变量。


如果用汇编来表示 fill_buffer(p,0,100)的调用过程,参考流程如下:


;lda x 为把x装到A中
;sta x 为把A的内容存到装x中
;得到第一个参数
lda p
sta buf_para
;得到第二个参数
lda #0
sta data_para
;得到第三个参数
lda #100
sta size_para
;跳转到具体函数代码位置
jsr fill_buffer



从这个流程可以看出指针p实际上没有被改写,虽然p所指的位置会被函数写入指定的内容,函数只是从p得到一个起始地址,在函数内部是通过另外一个指针来改写这个地址开始位置的内容,在调试中观察到的写指针是另外那个指针,并不是p。这也是C函数指针可以做输入输出参数,而变量只能做输入参数的原因。


如func(char *p,char data),函数可以读p所指的地址内容,也可以向p所指的地址写入指定内容,但data只能供函数使用,不能将函数中的值反存到data中。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言编程
    +关注

    关注

    6

    文章

    90

    浏览量

    21939
  • 面试题
    +关注

    关注

    1

    文章

    12

    浏览量

    8143
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言的常量介绍

    在程序执行过程中,值不发生改变的量称为常量。 mtianyan: C语言的常量可以分为直接常量和符号常量。 直接常量也称为字面量,是可以直接拿来使用,无需说明的量,比如: 整型常
    发表于 11-24 07:12

    C语言的printf基本用法介绍

    也是代码的一部分,但是它并不会给程序带来任何影响,编译器在编译阶段会忽略注释的内容,或者说删除注释的内容。我在《C语言标识符、关键字和注释》一节中做了详细讲解。 3) money 的
    发表于 11-12 07:04

    变形监测包含哪些内容?变形监测的重要性

    变形监测包含哪些内容?变形监测的核心在于持续获取工程结构关键部位在空间位置(位移、沉降、倾斜)和内部状态(应变、裂缝)上的变化信息。下面就让南京峟思给大家具体的介绍变形监测的相关
    的头像 发表于 08-27 11:27 367次阅读
    <b class='flag-5'>变形</b>监测包含哪些<b class='flag-5'>内容</b>?<b class='flag-5'>变形</b>监测的重要性

    详解hal_entry入口函数

    当使用RTOS时,程序从main函数开始进行线程调度;当没有使用RTOS时,C语言程序的入口函数main函数调用了hal_entry
    的头像 发表于 07-25 15:34 1652次阅读

    C语言中的内联函数与宏

    C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1706次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的内联<b class='flag-5'>函数</b>与宏

    深入理解C语言函数—编程中的“积木块”艺术

    在编程的世界里,函数就像建筑中的“积木块”——它们是构建复杂程序的基石。通过灵活组合这些模块,开发者能打造出功能强大且结构清晰的代码。函数之所以成为C语言的核心,正是因为它解决了编程中
    的头像 发表于 06-30 17:26 1479次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>函数</b>—编程中的“积木块”艺术

    【单片机C语言基础】1、什么是单片机及课程内容简单介绍

    本帖最后由 liuqiangew 于 2025-5-22 21:32 编辑 单片机C语言基础视频教程,想要学习的同学可以下载学习,资料包括学习资料和学习视频。 纯分享帖,需要者可点击附件
    发表于 05-22 21:29

    深入理解C语言C语言循环控制

    改变程序的执行流程,使代码更加灵活和可控。本文将详细介绍这些语句的作用及其应用场景,并通过示例代码进行说明。Part.1break语句C语言中break语句有两种
    的头像 发表于 04-29 18:49 1728次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    为什么不需要给回调函数传递参数

    回调函数C语言里面一个重要机制。
    的头像 发表于 04-15 10:11 618次阅读

    STM32H7 0x00000000地址的内容引发hardfault怎么解决?

    函数时入异常,进入hardfault. 求助:关于stm32h7 ,0x00000000地址的内容是如何被改变的?观察过正常情况下的值,如下。前三个地址的值是0,但异常时,前三个地
    发表于 03-07 08:15

    LD2410B/C新手必看攻略! 测试教程、模块调一文详解~

    关于LD2410B/C那些你不得不知道的事?免费申样、接线教程、参数解析、APP调教程、上位机调教程、常见异常情况自检等等内容,一文汇总~不管是萌新小白还是资深玩家,都可以快速入门
    的头像 发表于 02-05 18:09 2547次阅读
    LD2410B/<b class='flag-5'>C</b>新手必看攻略! 测试教程、模块调<b class='flag-5'>参</b>一文详解~

    C语言如何处理函数的返回值

    的那样,直接把 1234 赋值给了变量 ret? 搞懂这个问题不难,只要看下汇编代码就行。 把代码编译一下,只编译不链接,得到的就是C对应的汇编代码。 这块是 test 函数,不用管上面这些代码,如果一行一行去分析,没有汇编基础的话确实会头疼。 看下这行代码,很明显,12
    的头像 发表于 01-16 09:21 747次阅读

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言</b>中的DSP:从<b class='flag-5'>C</b>调用汇编类成员<b class='flag-5'>函数</b>

    C语言笔试题

    来看一个C语言笔试题,应该很少有人能给出正确答案。 #include int f(){ printf("this is f ..."); return 1;}int g(){ printf
    的头像 发表于 12-30 09:48 671次阅读

    LMX2595在不改变设定参数的情况下,能实现多宽范围的倍频?

    我想问一下LMX2595在倍频的过程中,在不改变设定参数的情况下,能实现多宽范围的倍频?
    发表于 12-12 07:05