/**********************************************************************
* 版权所有 (C)2017, Wang maochun。
*
* 文件名称:stu.c
* 文件标识:无
* 内容摘要:演示程序
* 其它说明:主要学习三点知识:
1.建立一个结构体,类型名为student
2.当定义结构体变量时,通过成员操作符访问成员(.)
当定义指向结构体的指针时,通过间接访问操作符(->)
3.传值操作,子函数对实参进行了一份拷贝,对其的操作不会影响到orginal value,我们通过打印地址和实参不同可以看到
传址操作,子函数传递了实参地址,此时操作的是orginal value,优点是节省空间和花销。如果子函数不修改需const修饰
* 当前版本:V1.0
* 作 者:Wang maochun
* 完成日期:2017.7.23
*
**********************************************************************/ #include <stdio.h>
struct student{
int code;
char name[];
char sex[];
int age;
};
void printStuInfobyValue(student stu)
{
printf("in fun结构体传值:学号、姓名、性别、年龄:\n");
printf("%5d [%p]\n %5s [%p]\n %5s [%p]\n %5d [%p]\n\n",stu.code,&stu.code,stu.name,&stu.name,
stu.sex,&stu.sex,stu.age,&stu.age);
} void printStuInfoByAdress(student* pstu)
{
printf("in fun结构体传地址:学号、姓名、性别、年龄:\n");
printf("%6d [%p]\n %6s [%p]\n %6s [%p]\n %6d [%p]\n\n",pstu->code,&pstu->code,pstu->name,&pstu->name,
pstu->sex,&pstu->sex,pstu->age,&pstu->age);
} int main(){
//struct student stu;
student stu = {,"wsq","Male",};
student *pstu = &stu;
printf("in main:学号、姓名、性别、年龄:\n");
//scanf("%d %s %s %d",&stu.code,stu.name,stu.sex,&stu.age);
printf("%5d [%p]\n %5s [%p]\n %5s [%p]\n %5d [%p]\n\n",stu.code,&stu.code,stu.name,&stu.name,
stu.sex,&stu.sex,stu.age,&stu.age);
printf("%6d [%p]\n %6s [%p]\n %6s [%p]\n %6d [%p]\n\n",pstu->code,&pstu->code,pstu->name,&pstu->name,
pstu->sex,&pstu->sex,pstu->age,&pstu->age); printStuInfobyValue(stu); //结构体传值
printStuInfoByAdress(&stu); //结构体传地址
return ;
}

运行效果:

我们可以看到:

结构体对象作为参数时,编译器对其进行了copy,(我们通过传入的地址和main中不同可以发现)。此时在函数中的操作都是对其拷贝的操作,不影响main函数中的origin value

   缺点是,当结构体变量非常大时,编译器对其进行复制,开销较大。

用结构体变量作实参时,采取的是"值传递"的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参.形参也必须是同类型的结构体变量.在函数调用期间形参也要占用内存单元.

这种传递方式在空间和时间上开销较大,如果结构体的规模很大时,开销是很可观的.

结构体地址作为参数时,子函数中操作和main函数操作的是同一个结构体,此时传递的参数时一个地址。

优点是不需要进行copy,但是使用时要小心,如果不想修改其值,需用const关键字修饰

C语言 结构体传值与传址分析的更多相关文章

  1. C#-函数的传值与传址

    传值就是将实参的值传到所调用的函数里面,实参的值并没有发生变化,默认传值的有int型,浮点型,bool型,char字符型,结构体等等. 传址就是将地址传到所调用的函数里面操作,实参的值也会跟着变化,传 ...

  2. java方法中,传参是传值还是传址问题(对比C语言、C#和C++)

    问题引出: 编写一个简单的交换值的小程序,如果我们只是简单地定义一个交换函数接收两个数,在函数内部定义一个中间变量完成交换.那么当我们把a,b两个实参传给这个函数时,往往得不到预期的结果.这是为什么呢 ...

  3. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  4. Python的传值和传址与copy和deepcopy

    1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会 ...

  5. javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象

    对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...

  6. 工控随笔_18_西门子_WinCC的VBS脚本_07_变量作用域和传值、传址

    在vbs脚本中也存在和其他编程语言一样的概念,那就是变量的作用域,变量的作用域决 定在什么范围内可以访问. 同样的在vbs脚本中对于变量也有一个生命周期, 变量的生命周期决定了变量的存续时间 这个主要 ...

  7. Python 传值和传址 copy/deepcopy

    传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...

  8. js- 引用和复制(传值和传址)

    js- 引用和复制(传值和传址) 好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西 先讲一下很基础的东西,看看js中几种数据类型分别传的什么引用:对象.数组.函数复制:数字 ...

  9. go语言结构体作为函数参数,采用的是值传递

    经过验证,go语言结构体作为函数参数,采用的是值传递.所以对于大型结构体传参,考虑到值传递的性能损耗,最好能采用指针传递. 验证代码: package main import ( "fmt& ...

随机推荐

  1. 04慕课网《vue.js2.5入门》——Vue-cli开发todolist

    主要文件目录: 文件代码: 根实例,初始化vue: <!--index.html,网站入口页面,和main.jsp组成一套.vue文件,包含--> <!DOCTYPE html> ...

  2. OpenCV学习笔记——疑问

    vec3b:表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的一个像素点.typedef Vec<uchar, 3> Vec3b; ...

  3. 博弈--ZOJ 3084 S-Nim(SG)

    题意: 首先输入K 表示一个集合的大小  之后输入集合 表示对于这对石子只能去这个集合中的元素的个数 之后输入 一个m 表示接下来对于这个集合要进行m次询问  之后m行 每行输入一个n 表示有n个堆  ...

  4. iOS- 指压即达,如何集成iOS9里的3D Touch

    1.前言   随着6S的到来,3DTouch被各大热门APP迅速普及,博主亲自体验后,发现使用便捷性大幅提高,随后自己照着文档,写了个Demo出来,分享给大家,希望能对有需要的朋友提供有一些帮助. 2 ...

  5. Qt下Doxygen使用

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt下Doxygen使用     本文地址:http://techieliang.com/20 ...

  6. LR之Java Vuser II

    最近项目待压测的服务端协议使用的是java的Netty框架开发,而传输的业务数据使用了google protobuf进行序列化,然后通过tcp数据流与客户端通讯.这一次的压测脚本决定使用LR的java ...

  7. ci上传图片

    o_upload.php <?php /** * Created by PhpStorm. * User: brady * Date: 2018/3/15 * Time: 14:10 */ cl ...

  8. IF与SWITCH

    今晚刚刚看了一点儿<大话设计模式>这本书,看到它示例的第一个程序,好像有点理解IF与SWITCH的区别了.大致的思考了总结出来. IF适用于每个条件都必须判断,就是IF语句中的判断是不同类 ...

  9. HSF源码剖析

    前言 HSF是一个分布式的远程服务调用框架,其实我更喜欢把分布式几个字去掉,因为HSF本身并不是一个单独的服务(指一个进程),他是附属在你的应用里的一个组件,一个RPC组件(远程过程调用——Remot ...

  10. 【前端学习笔记】JavaScript JSON对象相关操作

    //JSON方法 //JSON.parse(); var json = '{"name":"zj","age":23}'; JSON.par ...