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

    浏览量

    20977
  • 面试题
    +关注

    关注

    1

    文章

    9

    浏览量

    7901
收藏 人收藏

    评论

    相关推荐

    output函数怎么用

    output 函数是一个通用的术语,并不特指某个具体的编程语言或软件工具。 如果你在使用 Python 编程语言,那么可能是指 print 函数。Python 中的 print
    的头像 发表于 02-23 14:21 218次阅读

    嵌入式C编码中函数的规范

    ◎ 一个函数仅完成一件功能 ◎ 重复代码应该尽可能提炼成函数说明:重复代码提炼成函数可以带来维护成本的降低。重复代码是不良代码最典型的特征之一。在“代码能用就
    的头像 发表于 12-07 14:33 159次阅读

    c语言函数函数体用什么符号括起来

    函数 是指将一组能完成一个功能或多个功能的语句放在一起的 代码结构 。 在 C语言程序 中,至少会包含一个函数,及主函数main()。本文将详细讲解关于
    的头像 发表于 11-24 15:52 260次阅读
    c<b class='flag-5'>语言</b>中<b class='flag-5'>函数</b>的<b class='flag-5'>函数</b>体用什么符号括起来

    c语言源程序main函数的位置

    C语言源程序中的main函数是程序的入口点,它被认为是C语言程序的起点。在执行程序时,操作系统将首先定位到main函数,并从该函数开始执行程
    的头像 发表于 11-24 10:23 743次阅读

    c语言gets函数可以输入数字吗

    C语言中的gets函数是用来读取字符串的,而不是用来读取数字的。它会读取输入的字符直到遇到换行符或者文件结束符。因此,如果你尝试使用gets函数来读取数字,是无法准确获取数字本身的。 首先,让我们
    的头像 发表于 11-24 10:00 594次阅读

    c语言max函数在哪个库

    C语言的max函数并不属于标准C库,它通常是由程序员自己编写的一个宏定义。max函数用于比较两个数的大小,返回较大的数值。 为了提供更多详实的信息,下面将详细介绍C语言中max
    的头像 发表于 11-22 10:18 1220次阅读

    c语言max函数的使用方法

    C语言是一门广泛使用的编程语言,提供了许多内置的函数来执行各种任务。其中一个非常有用的函数是max函数,它用于比较两个值并返回较大的那个值。
    的头像 发表于 11-22 10:15 3972次阅读

    C语言函数返回1和返回0究竟哪个好?

    模糊,因为并没有具体说明函数执行失败的原因。因此,本文将从一些实际例子入手,详细分析和比较C语言函数返回1和返回0的优缺点,以期解决这个问题。 先来分析一下返回1的优点。首先,返回1意
    的头像 发表于 10-31 14:43 417次阅读

    怎么设计c语言的可变长参数函数

    怎么设计c语言的可变长参数函数
    发表于 10-27 07:10

    经典C语言接口与实现:创建可重用软件的技术

    C语言接口与实现(创建可重用软件的技术)概念清晰、内容新颖、实例详尽,是一本有关设计、实现和有效使用C语言
    发表于 09-25 06:42

    C语言中memmove函数的使用

    在C语言编程中,内存操作是不可或缺的一部分,而 memmove 函数是其中一个重要的工具。本文将介绍 memmove 函数的应用场景以及提供详细的示例代码,帮助您更好地理解如何使用这个函数
    发表于 09-13 09:17 605次阅读

    C语言函数的基本知识

    函数是C语言中的基本构建块之一,它允许我们将代码组织成可重用、模块化的单元。
    发表于 08-16 18:25 366次阅读

    C语言中指针函数函数指针的概念及应用示例

    在C语言中,指针函数函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能。
    发表于 08-16 16:14 320次阅读

    C语言main函数的正确写法

    大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言main函数的正确写法,希望能对你有所帮助
    发表于 07-11 11:51 367次阅读
    C<b class='flag-5'>语言</b>main<b class='flag-5'>函数</b>的正确写法

    【感芯科技MC3172开发板体验】变函数实现printf函数

    函数C语言中经常用到的一类函数,例如常见的printf、scanf等都是变
    发表于 05-27 10:08