结构体类型数据作为函数参数(三种方法)

(1)用结构体变量名作为参数。


代码如下:

#include<iostream>
#include<string>
using namespace std;
struct Student{
 string name;
 int score;
};
int main(){
 Student one;
 void Print(Student one);
 one.name="千手";
 one.score=99;
 Print(one);
 cout<<one.name<<endl;
 cout<<one.score<<endl;//验证 score的值是否加一了
 return 0;
}
void Print(Student one){
 cout<<one.name<<endl;
 cout<<++one.score<<endl;//在Print函数中,对score进行加一
}


这种方式值采取的“值传递”的方式,将结构体变量所占的内存单元的内存全部顺序传递给形参。在函数调用期间形参也要占用内存单元。这种传递方式在空间和实践上开销较大,如果结构体的规模很大时,开销是很客观的。

并且,由于采用值传递的方式,如果在函数被执行期间改变了形参的值,该值不能反映到主调函数中的对应的实参,这往往不能满足使用要求。因此一般较少使用这种方法。

(2)用指向结构体变量的指针作为函数参数


代码如下:

#include<iostream>
#include<string>
using namespace std;
struct Student{
 string name;
 int score;
};
int main(){
 Student one;
 void Print(Student *p);
 one.name="千手";
 one.score=99;
 Student *p=&one;
 Print(p);
 cout<<one.name<<endl;
 cout<<one.score<<endl;//验证 score的值是否加一了
 return 0;
}
void Print(Student *p){
 cout<<p->name<<endl;
 cout<<++p->score<<endl;//在Print函数中,对score进行加一
}

这种方式虽然也是值传递的方式,但是这次传递的值却是指针。通过改变指针指向的结构体变量的值,可以间接改变实参的值。并且,在调用函数期间,仅仅建立了一个指针变量,大大的减小了系统的开销。

(3)用接头体变量的引用变量作函数参数


代码如下:

#include<iostream>
#include<string>
using namespace std;
struct Student{
 string name;
 int score;
};
int main(){
 Student one;
 void Print(Student &one);
 one.name="千手";
 one.score=99;
 Print(one);
 cout<<one.name<<endl;
 cout<<one.score<<endl;//验证 score的值是否加一了
 return 0;
}
void Print(Student &one){
 cout<<one.name<<endl;
 cout<<++one.score<<endl;//在Print函数中,对score进行加一
}

实参是结构体变量,形参是对应的结构体类型的引用,虚实结合时传递的是地址,因而执行效率比较高。而且,与指针作为函数参数相比较,它看起来更加直观易懂。

因而,引用变量作为函数参数,它可以提高效率,而且保持程序良好的可读性。

(0)

相关推荐

  • c#字符串值类型与引用类型比较示例

    复制代码 代码如下: classProgram{    staticvoid Main() {        int a = 9;    //给变量a赋值为9        int b = a;   //将a的副本给变量b        b = 10;        Console.WriteLine(string.Format("a={0},b={1}", a, b));        Person ZS = newPerson();       //张三        ZS.Age

  • 深入解析c#中枚举类型的定义与使用

    介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 定义默认基数从O开始,也可指定数值.enum Days { Saturday=1, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; 使用C

  • 关于c#中枚举类型支持显示中文的扩展说明

    复制代码 代码如下: AuditEnum.cs : public enum AuditEnum{ Holding=0,     Auditing=1, Pass=2, Reject=3      } 以asp.net为例 , 程序中某个方法可能会这样使用枚举值 :public void HandleAudit(int userID, AuditEnum ae){ if (ae==AuditEnum.Pass) { //do something } else if (ae==AuditEnum.R

  • C#枚举类型与结构类型实例解析

    本文以C#实例讲解了枚举类型与结构类型的用法,程序主要是通过个人电话本演示枚举类型与结构类型的用法,具体代码如下所示: using System; class ID { //定义枚举类型 public enum Sex { male, female };//注意别忘了这里的分号 //定义电话本的结构类型 public struct TelBook { public string name; public Sex sex;//性别类型为枚举类型 public string number; } //

  • C#不同类型的成员变量(字段)的默认值介绍

    创建类的一个实例时,在执行构造函数之前,如果你没有给成员变量赋初始值,C#编译器缺省将每一个成员变量初始化为他的默认值. 如果变量是方法的局部变量,编译器就会认为在使用该变量之前,代码必须给它显示的设定一个值.否则会发生"使用了未赋值的局部变量"的错误. 对于其他情况,编译器会在创建变量时,把变量初始化为默认值.1.对于整型.浮点型.枚举类型(数值型),默认值为0或0.0.2.字符类型的默认值为\x0000.3.布尔类型的默认值为false.4.引用类型的默认值为null. 如果声时变

  • c#使用反射调用类型成员示例

    在实际的工作中直接使用反射的机会比较少,有印象的就是一次自己做的WinForms小工具的时候利用反射来动态获取窗体上的每个控件,并且为必要的控件动态添加注册事件.因为刚入职新公司,为了更快的了解公司的业务.和开发习惯,先和现在公司同事一起修改现有系统的一些小Bug.在Tester提交的Bug中有一个是对GridView进行动态的排序--点击一个列时使用该列作为条件进行排序(PS:点击一个列时前台会将该列的字符串(该字符串是)传到后台的方法中). 使用反射的原因 为什么会选择使用反射呢?在项目中我

  • C# 遍历枚举类型的所有元素

    比如定义了一个错误的枚举类型 复制代码 代码如下: public enum eErrorDetailCode : int         {             登陆成功 = 0,             登出 = 1,             应用错误 = 2,             成功 = 16,             失败 = 17         } 需要引用 using System; 然后在循环中,遍历枚举对象的所有元素 复制代码 代码如下: foreach (int  m

  • C#值类型和引用类型的深入理解

    从概念上看,值类型直接存储其值,而引用类型存储对其值的引用.这两种类型存储在内存的不同地方.在C#中,我们必须在设计类型的时候就决定类型实例的行为.这种决定非常重要,用<CLR via C#>作者Jeffrey Richter的话来 说,"不理解引用类型和值类型区别的程序员将会给代码引入诡异的bug和性能问题(I believe that a developer who misunderstands the difference between reference types and

  • c#值类型和引用类型使用示例

    在刚参加工作面试时,我们经常会遇到有关值类型和引用类型的问题,你回答的怎么样直接影响你在别人心目中的印象,你回答的不好说明你对C#没有深入的了解学习,今天我带大家回顾下C#中的引用类型和值类型.CLR支持两种类型:引用类型和值类型.虽然FCL中大多数类型都是引用类型但程序中用的最多的还是值类型.引用类型总是从托管堆上分配的,C#的new操作会返回对象的内存地址--也就是指向对象的数据的内存地址.设想假设每次使用一个Int32值时,都进行一次内存分配,性能会受到多大的影响,为了提升简单.常用的类型

  • c#入门之类型转换详解

    "无论是什么类型,所有的数据都是一系列的位,即一系列0和1.变量的含义是通过解释这些数据的方式来传达的."--这句原话是书上翻译的,不过后一句话总感觉理解起来不是很通俗,自己觉得这样理解可能会合适些:无论什么类型的数据,在计算机存储时都是0和1,而变量的意义,就是以不同的方式来解释这些数据,以达到满足程序应用.节约内存等需求. 换句话说:变量存在的意义,就是建立规(标)范(准)的数据存储方式. 隐式转换 类型转换分两种形式:隐式转换.显示转换. 隐式转换不需要单独的表达式,只需要把满足

随机推荐