从函数传递字符串的方法看 c 变量属性

本文探讨C语言中函数处理字符串的几种方法,强调了由于C语言没有引用,需要通过传值或传址来实现对变量的影响。文章详细解释了函数参数的存储方式、生命周期,以及栈和堆的区别。特别指出,直接返回函数内部字符数组的地址会导致错误,因为函数结束时,数组可能被回收。此外,还总结了变量的作用域、链接属性和存储类型,并列举了一些常用的字符串处理函数。
摘要由CSDN通过智能技术生成

 上篇,提到的从函数中传出字符串的约 5 种方法。函数对于变量处理大体可分为如下几类:1.只需要传入,而不需要传出。可能涉及到的情况是,对某些值、数据进行判断、计算、比较、输出等操作,此时,只需要将 data 传入,我们不希望函数中的操作对原值有什么影响。2.只需要传出,而不需要传入。可能涉及的情况是:传出用户输入、生成的某些值、获取状态等操作。此时不需要传入,只会将 data 传出,将之在 main() 函数中处理、保存、赋值等操作,我们希望这些值在函数中产生,传出函数后,仍然存在。3.既需要传入,又需要传出。可能涉及的情况:变量传入函数,在函数中处理,处理后传出,或者直接改变该变量,并且将改变更新到原变量或者改变能对原变量直接造成影响。


 由于在C语言中,并没有引用的概念(C++引用的概念:以引用为参数,则既可以使得对形参的任何操作都能改变相应数据,又使函数调用方便)。在 c 中函数传参只有二种传参方式:传值、传址,传参是以实参、形参形式传递,发生函数调用时,实参的值会传递给形参。
形参(形式参数):在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。实参(实际参数):函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
(1)形参和实参各占一个独立的存储空间。
(2)形参的存储空间是函数被调用时才分配的,调用开始,系统为形参开辟一个临时的存储区,然后将各实参传递给形参,这是形参就得到了实参的值。
 形参,说白了,就是 c 对实参的复制品,对复制品的操作自然不会影响到真品。程序员对此自然不满足,有上段提到的需求,自然要绞尽脑汁的使需求得到满足。于是就有了传某地址,比如我们传实参是 0x0f,形参立即拷贝了一份也得到了值:0x0f,成功把地址传递以后,函数中就可以对地址中的 value 进行操作了,由于我们不关心地址,地址也不需要改变,我们需要改变的是 value,但 value 不是形参,所以不存在不能改变的说法,曲线达到目的,完成函数对原址的影响操作。


 此外,函数还有返回值的属性。单个的值可以通过直接返回;多个值可以通一保存在一个地址中,通过返回地址返回。假设函数中产生了一个字符串,存储在函数字符数组(char str[128]),直接返回数组地址,以达到返回该字符串的目的,但这样做是错误的,原因就是函数中变量的生命周期和函数是一致的,函数调用结束后,str变量便有极大可能被回收,结果我们返回的字符串地址为空,根本达不到我们的目的。

内存分区变量存储位置

在这里插入图片描述
一个程序被加载到内存中,这块内存首先就存在两种属性:静态分配内存和动态分配内存。
静态分配内存:是在程序编译和链接时就确定好的内存。
动态分配内存:是在程序加载、调入、执行的时候分配/回收的内存。

1、栈 (stack)
  栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}” 中定义
的变量(但不不包括static声明的变量,static意味着在数据段中存放变量)。
除此以外, 在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,
函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场。
从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

2、堆(heap)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值