C语言--函数形参与实参详解

关于指针
32位编译器下指针字节数恒为4字节
64位编译器下指针字节数恒为8字节
大多数编译器都默认为32位(VS可以自己设置),编译器位数与电脑位数无关

定义指针必须初始化
没有被初始化的指针会指向未知的内存空间,未经初始化的指针所指的内容不能被操作。

关于C语言的内存分配
栈区空间:在函数{}内部定义的变量称为局部变量,系统将局部变量内存分配在栈区,函数调用完毕后此块内存便被销毁。这里所谓的销毁并不是将局部数据所占用的内存全部抹掉,而是程序放弃对它的使用权限,弃之不理,后面的代码可以随意使用这块内存。对于栈区空间,如果使用及时也能够得到正确的数据,如果有其它函数被调用就会覆盖这块内存,得到的数据就失去了意义

堆区空间:使用malloc(该函数在成功时返回所分配空间的首地址,失败返回NULL)等函数开辟的空间,该区域在程序结束前一直存在,通常需要用户使用free函数(free函数是释放指针所指向的空间)手动释放

形参与实参:
首先,对于C语言来说,所有的参数传递均为按值传递,这里的参数传递也包括return函数将值返回的过程。
先说函数调用时的实参传递,参数传递过程实际上是实参将自己的字面值(可能是整数,字符,16进制地址等,这取决与参数的数据类型)拷贝一份然后赋值给形参。也就是说函数内部操作的形参和外部的实参是两个不同的变量,所以在内部操作形参变量自然无法改变外部传入的实参。
而传入指针变量时,外部实参指针指向自己的作用域分配的空间,而形参接受到的地址同样指向该片空间,所以此时对形参指针变量所指向的值进行操作时自然会影响外部地址变量所指向的内容。
而对于函数的返回值,返回的同样是字面值(整数,字符,地址等),但如果我们要函数返回一个在函数内部声明的指针,那么由于函数结束后栈区空间会被释放,本来指向栈区空间的某块内存的指针也便失去了意义。所以,如果想得到函数内部定义的指针,就必须对该指针分配堆区空间,即使用malloc函数给其分配空间才能保证指针指向的内容在函数结束后还可以正常被操作。

以上为作者参考资料后的个人理解,如有错误的部分还望大佬指出

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值