结构体指针和结构体变量在调用函数中的区别?

学线性表的时候看到一个L->length和L.length,在函数中用法都一样,只有形参的定义不同,前者是SqList*L,后者是SqListL。我想问一下,主函数调用其... 学线性表的时候看到一个L->length和L.length,在函数中用法都一样,只有形参的定义不同,前者是SqList *L,后者是SqList L。我想问一下,主函数调用其他函数时,形参传给实参,结构体指针是否不用开辟新空间,且直接改变堆内存中的数值;而结构体变量只改变了栈内存中的数值,且要另开辟新空间?

我对这方面不是很了解,请高手帮我讲详细点。
展开
 我来答
寻森良Z
推荐于2017-10-03 · TA获得超过368个赞
知道小有建树答主
回答量:124
采纳率:0%
帮助的人:131万
展开全部
你的理解是对的。
形参是结构体变量的,你对该结构体的所有修改都不会影响到实参,因为形参是实参的一个完整拷贝。
形参是结构体指针的,你对该结构体的修改直接影响实参的结构体数据。因为形参和实参都指向同一个内存区块。注意:形参是一个指针,如果只改变指针本身,则不影响实参。
追问
那么是不是说,我在主函数中调用到了一个形参为结构体变量的函数,函数在主函数中运行时,是不是不会改变实参?如果是这样的话,为什么课本上分成这变量贺指针两种形式来写呢?
追答
C/C++语言中的函数调用时,参数传递方式默认是“值传递”,即是将实参做一个份内存拷贝给形参。仅有C++中函数中明确声明某个参数为引用类型时才是“引用传递”,引用传递没有增加变量,引用传递的形参和实参对应同一个内存地址。

实参通常位于主调函数的栈空间,形参则一定位于被调函数的栈空间(当然也可以是通过CPU寄存器直接传值,效果相同)。
参数类型是结构体的,实参和形参是两个完全独立的内存区,修改一个不会对另一个有任何影响。
如果该结构体中有指针,则两个结构体中的该指针都指向同一内存区,使用时要特别小心。
参数类型是指针的,实参和形参指向相同内存区域,通过实参或形参都可修改该内存区。

使用哪种类型参数,由编程场景决定:
当程序中需要“结构体内存拷贝”时,考虑使用结构体类型参数。
当程序中需要“通过调用函数修改结构体内容”时,C语言中只能通过传递指针类型参数。(C++也可以声明为结构体引用类型来实现,但不推荐)。
其它情形的,可综合考虑运行效率和代码复杂度决定。一般传递指针要比拷贝结构体快很多,结构体庞大时更明显。如果在被调函数中不需要修改传入结构体的数据,推荐使用"常量结构体指针",例如 void fun(const struct SA* psa);
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式