一、结构体与函数参数
结构体作函数参数可分为传值与传指针。
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语言结构体链表的排序方法:选择排序与插入排序 在计算机科学领域,数据结构与算法的设计是实现高效程序的关键。对于链表这种基本的数据结构而言,掌握其排序方法至关重要。本文将深入探讨两种常用的链表排序...
计算机基础知识汇总 计算机基础知识汇总可以分为六大块:组成原理、操作系统、数据库、编译原理、计算机网络、数据结构,以及分布式基础知识。 1. 组成原理 计算机组成原理是计算机专业的基础知识,包括冯诺依曼...
该系统使用C语言的结构体特点,设计了一个可行、易操作的学生信息管理系统,能够高效实现信息的录入、删除、编辑、查询、分析、汇总、打印等功能。 需求分析:系统需求包括用户能够添加、编辑、查询、删除有关学生...
C语言重点知识汇总整理 C语言是一种广泛使用的高级编程语言,具有结构化、模块化、可移植性强等特点。本文将总结C语言的重点知识,包括程序结构、数据类型、运算符、控制结构、函数、数组、指针、结构体、文件操作...
以下是对“二级C语言公共基础知识汇总”的详细解读。 1. **基本数据类型**:C语言提供了几种基本的数据类型,包括整型(int)、字符型(char)、浮点型(float, double)和布尔型(在C99标准中引入,通常为枚举类型...
在前五周的知识汇总中,我们主要学习了 MATLAB 的基本操作、矩阵处理、统计函数、绘图以及数据存取等方面的内容。 1. **基本操作与矩阵输入**: - MATLAB 提供了一些特殊常量,如 `inf` 表示无穷大,`nan` 表示非...
C++语言基础知识汇总 本资源汇总了C++语言的基础知识,涵盖了C++语言的字符集、词汇、基本数据类型、运算符、表达式、常量、变量、输入输出、控制结构、数组、结构体、共用体、枚举类型、指针、引用、动态内存分配...
全国计算机二级考试C语言易错知识点汇总 本文档总结了全国计算机二级考试C语言易错知识点,涵盖指针、文件操作、位运算、宏定义、结构体操作、链表操作等多个方面。 一、指针 在C语言中,指针是一种特殊的变量,...
5. **结构体与联合体**:了解如何使用结构体来组织复杂的数据。 6. **文件操作**:学习读写文件的基本方法,以及文件指针的使用。 7. **预处理器**:理解宏定义、头文件包含等预处理器指令的作用。 【PHP知识点】...
1.基础知识 基本类型 复合类型 流程控制Switch 2.函数 函数定义 函数类型 匿名函数 defer 闭包 错误处理 panic和recover error错误类型 go 汇编 3.类型系统 类型简介 声明类型 结构体类型 函数类型 类型组合和方法集...
这份"思维导图-知识点汇总"提供了全面的C语言学习框架,帮助学习者系统地理解和掌握C语言的核心概念。 首先,C语言的基础部分包括变量、数据类型、运算符和表达式。变量是存储数据的容器,数据类型则规定了变量可以...
本资源"《C语言基础知识汇总》"是一个针对C语言初学者的综合教程,旨在帮助新手快速掌握C语言的核心概念和基本操作。 1. **数据类型**:C语言提供了多种数据类型,包括整型(如int)、浮点型(如float和double)、...
【C语言基础知识汇总】 C语言是一种强大的、底层的编程语言,它的基础知识构成了许多现代编程语言的基础。以下是关于C语言的一些核心知识点: 1. 函数参数传递:C语言中,函数参数传递主要有两种方式:值传递和...
### C#基础知识系统汇总 #### 一、C#概述 C#是一种面向对象的编程语言,结合了C++的强大特性和Java的优雅风格,以及BASIC的易用性。它由微软开发,主要应用于Windows平台上的软件开发。C#不仅支持传统的桌面应用...
《C语言基础知识汇总》 C语言作为一门基础的编程语言,是许多程序员入门的首选。其简洁、高效的特点使得它在计算机科学领域占有重要地位。本文将深入探讨C语言的基础知识,包括字符集、词汇、数据类型、运算符以及...
本文主要涵盖了数据结构和算法的一些基础知识,包括时间复杂度、线性表的存储结构、链表的逆置操作、队列的链式存储以及内存对齐的概念。 1. 时间复杂度分析: 时间复杂度用来衡量算法执行效率,O(1)表示常数时间,...
8. **结构体与联合体**:理解结构体和联合体的概念,编写涉及结构体的程序。 9. **位操作**:使用位运算符完成特定的逻辑操作,例如设置、清除、翻转位等。 10. **异常处理**:了解如何使用setjmp和longjmp进行非...
"初学者入门必备C语言基础知识大汇总.zip" 文件显然是为了帮助初学者系统地学习和掌握C语言的关键概念和语法。 C语言的基础知识主要涵盖以下几个方面: 1. **变量与数据类型**:C语言中的数据类型包括基本类型(如...