`
xiaoer_1982
  • 浏览: 1829309 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

结构体知识汇总

阅读更多

一、结构体与函数参数
结构体作函数参数可分为传值与传指针。
1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数。在这种情况下,由于涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响,所以这种方法基本不用。
例如:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;

void fun(STUDENT stu)
{
printf(“stu.name=%s,stu.age=%d\n”,stu.name,stu.age);
}



2.传指针时直接将结构体的首地址传递给函数体,在函数体中通过指针引用结构体成员,可以对结构体参数成员的值造成实际影响。这种用法效率高,经常采用。
例如:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;

void fun(STUDENT* pStu)
{
printf(“pStu->name=%s,pStu->age=%d\n”,pStu->name,pStu->age);
}

二、结构体与函数返回值
对于某些版本的C语言编译器,返回值仅能为基本数据类型如int、char以及指针,因此结构体作为一种组合数据类型,不能以值的方式返回,而在有些版本的C编译器中又可以直接返回结构体变量 ,在C++中也是可以直接返回结构体变量的。

直接返回结构体变量示例如下;
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;

STUDENT fun();
int _tmain(int argc, _TCHAR* argv[])
{
STUDENT p=fun();
printf("p.name=%s",p.name);
return 0;
}

STUDENT fun()
{
STUDENT stu;
stu.age=18;
strcpy(stu.name,"xiaoming");
return stu;
}

以指针方式返回结构体示例如下:
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;


STUDENT* fun()
{
STUDENT* p=malloc(sizeof(STUDENT));
p->age=18;
strcpy(p->name,"xiaoming");
return p;
}

二、结构体和类的比较
区别:
结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。
1.结构的构造函数和类的构造函数不同。
a.结构不能包含显式的无参数构造函数。结构成员讲自动初始化为它们的默认值。
b.结构不能包含以下形式的初始值设定类:base(argument-list);
2.对于结构中的实例字段成员,不能在声明时赋值初始化。
3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。

5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能。
最后引用博客园的“越过林子”的话:
结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内 联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和 B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结 构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速 度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。
还有一点:struct与class本质上应该是相同的,只是默认 的访问权限不同(struct默认是public,class默认是private ).之所以要保留struct,很大一部分原因是为了与C兼容吧(C++的一篇文章中是这么说的,我感觉还是有一定的道理). class感觉是应该是struct的扩充,除了可以设置成员的访问类型外,还可以有自己的成员函数,可以继承派生等,好象struct能做的class 都能做,但反过来就不行了,如果没有保护数据的要求,struct能做的我都用struct做,比较简单。

类和结构体的区别
1. class和structure很相似, 从技术层面讲,class是引用,而structure则是数值. 有人很形象的说
class里有行动,方法,成员,是有机体的结合,而structure则是活生生的有机体,
2. 通俗的理解,class包涵structure, class里有方法拉,成员拉,什么滴,
而structure只有数据,

类与结构的示例比较:

  结构示例:
  public struct Person
  {
  string Name;
  int height;
int weight
  public bool overWeight()
  {
  //implement something
  }
  }
  类示例:
  public class TestTime
  {
  int hours;
  int minutes;
  int seconds;
  public void passtime()
  {
  //implementation of behavior
  }
  }

  调用过程:
  public class Test
  {
  public static ovid Main
  {
  Person Myperson=new Person //声明结构
  TestTime Mytime=New TestTime //声明类
  }
  }
 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?

类与结构的差别
  1.值类型与引用类型
  结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型
  类是引用类型:引用类型在堆上分配地址
  堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
  因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
  注:
  1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
  2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
  2.继承性
  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
  类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
  注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
  例如:结构实现接口
  interface IImage
  {
  void Paint();
  }
  struct Picture : IImage
  {
  public void Paint()
  {
  // painting code goes here
  }
  private int x, y, z; // other struct members
  }
  3.内部结构:
  结构:
  没有默认的构造函数,但是可以添加构造函数   没有析构函数   没有 abstract 和 sealed(因为不能继承)   不能有protected 修饰符   可以不使用new 初始化   在结构中初始化实例字段是错误的
  类:
  有默认的构造函数
  有析构函数
  可以使用 abstract 和 sealed
  有protected 修饰符
 必须使用new 初始化

如何选择结构还是类
  讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
  1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
  2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
  3.在表现抽象和多级别的对象层次时,类是最好的选择
  4.大多数情况下该类型只是一些数据时,结构时最佳的选择
1: 类可以继承,结构不可以.
2: 类是引用类型,结构是值类型
3: 类在堆中,结构在栈分配内存

分享到:
评论

相关推荐

    C语言结构体知识汇总

    C语言结构体部分内容详解包括结构体定义及使用,结构体函数的定义及使用,指向结构体的指针

    C语言基于结构体的学生信息管理系统实现.pdf

    该系统使用C语言的结构体特点,设计了一个可行、易操作的学生信息管理系统,能够高效实现信息的录入、删除、编辑、查询、分析、汇总、打印等功能。 需求分析:系统需求包括用户能够添加、编辑、查询、删除有关学生...

    C语言 重点知识汇总整理

    C语言重点知识汇总整理 C语言是一种广泛使用的高级编程语言,具有结构化、模块化、可移植性强等特点。本文将总结C语言的重点知识,包括程序结构、数据类型、运算符、控制结构、函数、数组、指针、结构体、文件操作...

    全国计算机二级考试C语言易错知识点汇总.doc

    全国计算机二级考试C语言易错知识点汇总 本文档总结了全国计算机二级考试C语言易错知识点,涵盖指针、文件操作、位运算、宏定义、结构体操作、链表操作等多个方面。 一、指针 在C语言中,指针是一种特殊的变量,...

    数据结构与算法知识汇总1

    声明一个structnode结构体类型的指针变量 b;4. 通常,“较稳定”的线性表选择顺序存储,而频繁做插入删除等“动态性”较强的线性表宜选择链式存储。(线性

    华为C语言面试汇总.pdf

    作为一份C语言面试汇总资源,华为C语言面试汇总.pdf涵盖了C语言的多个方面,涉及到数据类型、变量、运算符、控制结构、函数、数组、指针、字符串、结构体、文件输入输出等多个领域。下面将对这些知识点进行详细的...

    c语言城市天气信息档案管理系统,包含二维结构体数组定义使用,柱形图绘制,数据排序,读取数据库,清空文件等。

    C语言入门知识汇总,可用于学习系统的构成。此为肇院C语言综合训练题目。

    c语言经典编程100例.pdf

    本资源摘要信息是关于C语言经典编程100例的知识点汇总,涵盖了C语言的基本概念、数据类型、运算符、控制结构、函数、数组、指针、字符串、结构体、文件输入输出等方面。 基本概念 * 程序设计的基本概念:变量、...

    华中科技大学C语言实验与专业课程设计上机实验报告汇总.docx

    本实验报告汇总了华中科技大学C语言实验与专业课程设计的所有实验内容,涵盖了C语言的基本概念、运算符、数据类型、函数、数组、指针、结构体、文件操作等多个方面。通过对每个实验的详细分析和错误修正,本报告展示...

    (完整word版)C语言程序设计+复习题库.doc

    本文将对C语言程序设计的基本概念、语法、函数、数组、指针、字符串、结构体、文件输入输出、预处理命令等方面进行详细的知识点汇总。 变量和数据类型 * C语言中变量的声明必须指定数据类型 * C语言中的基本数据...

    C++-primer-plus(第6版)中文版-编程练习答案(word版).pdf

    C++primer-plus第6版中文版编程练习答案汇总 本资源摘要信息是对C++primer-plus第6版中文版编程练习答案的总结,涵盖了C++语言的基础知识和编程实践。 第二章:开始学习C++ 本章节主要介绍了C++语言的基本知识,...

    计算机二级C语言程序的设计汇总.doc

    计算机二级C语言程序设计汇总 本文档总结了计算机二级C语言程序设计的十个重要知识点,涉及字符串处理、数组操作、函数设计、数字计算等多个方面。 一、字符串处理:输入字符串*A*BC*DEF*G,输出ABCDEFG 在这个...

    c语言期末考试题及其答案.doc

    本资源是关于C语言期末考试题及其答案的汇总,涵盖了C语言的基础知识点,包括变量、数据类型、运算符、控制结构、函数、数组、指针、结构体、枚举类型、文件输入/输出等方面。 一、变量和数据类型 * C语言源程序的...

    Golang基础语法和gorm以及gin总汇精简版10000字

    资源内包含了golang的基础语法例如匿名函数回调函数channel结构体接收者以及面向对象编程方面的知识,gorm基础的增删改查和部分进阶以及gin的介绍和使用方式以及有例子说明供参考。此资源为个人所撰写。

    明解C语言(第3版)入门篇.[日]柴田望洋(带详细书签).pdf 【半高清】

    文件数据汇总 370 写入日期和时间 372 获取上一次运行时的信息 376 显示文件内容 378 文件的复制 380 13-2 文本和二进制 382 在文本文件中保存实数 382 文本文件和二进制文件 383 在二进制文件中保存实数 ...

    计算机C语言二级考试题目.doc

    本资源是计算机C语言二级考试题目的汇总,涵盖了基本数据类型、运算符、控制结构、数组、指针、函数等多方面的知识点。 1. 变量和数据类型 * C语言中有多种基本数据类型,如整数、浮点数、字符等。 * 变量是存储...

    C++选择题汇总-题库.doc

    C++选择题汇总-题库 以下是从给定的文件中生成的相关知识点: 1. C++标点符号:在 C++语言中,//表示行注释的开始,而不是#或)等其他符号。 2. C++标示符:在 C++语言中,标示符可以是字母、数字或下划线的组合...

    C语言从入门到精通

    第2篇【核心技术】主要讲解C语言中的函数、函数中的变量、指针、指针进阶、文件、编译与预处理指令、库函数、位运算、结构体和联合体、数据结构等;第3篇【趣味题解】主要讲解哥德巴赫猜想、猴子选大王游戏、迷宫...

    嵌入式软件开发工程师面试题

    这个问题考察了候选人的C语言知识,可以使用结构体实现。 2. Why cannot arrays be passed by values to functions? 这个问题考察了候选人的C语言知识,可以使用数组实现。 3. Advantages and disadvantages of ...

    C语言程序设计 笔试试题.doc

    本资源汇总了 C 语言程序设计的笔试试题,涵盖了 C 语言的基本概念、数据类型、运算符、控制结构、函数、数组、指针、结构体、枚举类型、union 等多个方面的知识点。 1. C 语言中的函数类型 在 C 语言中,如果对...

Global site tag (gtag.js) - Google Analytics