一、C++结构体用法
1、结构体:
结构体用来存放若干不同类型(也可以是相同类型)的数据项。
2、结构体类型的格式
struct 结构体类型名
{
类型名 成员名;
};
如:
struct Student
{
int num;
char name[20];
int age;
float score;
char addr[30];
};
这时只是定义一种结构体类型,系统并不分配实际的内存单元
3、定义结构体类型变量
方法一:先声明结构体类型再定义变量
结构体类型名 结构体变量名;
如:
Student student1,student2;
方法二:在声明类型的同时定义变量
struct 结构体名
{
成员表
}变量名表;
如:
struct Student
{
int num;
char name[20];
int age;
float score;
char addr[30];
};student1,student2;
4、结构体变量的初始化
如:
Student student1{10002,“xiaoming”,20,90,"Hangzhou"};
5、引用结构体变量
(1) 将一个结构体变量的值赋给另一个具有相同结构的结构体变量
如:
student1=student2;
(2)引用结构体变量中的一个成员
形式:
结构体变量名.成员名
如:
student1.num=10020;
6、结构体数组
如:
struct Student
{
int num;
string name;
};student[3]={1,"小米",2,“大米”};
7、指向结构体变量的指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址。
如:
struct Student
{
int num;
char name[20];
int age;
float score;
char addr[30];
};
Student stu;//定义Student类型的变量stu
Student *P=&stu;//定义p为指向Student类型数据的指针变量并指向stu
以下三种用法等价
stu.num,(*p).num,p -> num
8 使用结构体方法
typedef struct student {
uint32_t id;
uint32_t num;
} STUDENT_S;
STUDENT_S xiaoming = {0,0}
9 结构体的拷贝
strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等
memcpy()函数语法
void* memcpy(void* _Dst,const void* _Src,size_t _Size);
_Dst:新缓冲区。
_Src:复制的缓冲区。
_Size:要复制的字节数。
因为参数是void*类型,所以可以将其他任意的类型转换为void*类型,但是拷贝的大小会受到_Size的控制。
typedef struct student {
uint32_t id;
uint32_t num;
} STUDENT_S;
STUDENT_S xiaoming = {100,100};
STUDENT_S xiaomingCpy = {0,0};
memcpy(&xiaomingCpy,&xiaoming,sizeof(STUDENT_S));
二 、C#结构体用法
1、C#的结构称为轻量级的类,它和类一样拥有诸如字段和方法这样的成员,我们可以用new来创建一个结构的实例。但是结构是值类型,而类是引用类型。值类型在栈中分配或以内联的方式分配,当超出范围时释放分配空间。引用类型在堆中分配,它未使用的实例会进行垃圾回收。
堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。
c# 类和结构的比较:
- 类是引用类型,结构是值类型。
- 结构不支持继承。
- 结构不能声明默认的构造函数。
- 结构体中声明的字段无法赋予初值,类可以。
2、C# 简单的结构体用法与C++用法一样
using System;
using System.Text;
struct Books
{
public string title;
public string author;
public string subject;
public int book_id;
};
public class testStructure
{
public static void Main(string[] args)
{
Books Book1; /* 声明 Book1,类型为 Book */
Books Book2; /* 声明 Book2,类型为 Book */
/* book 1 详述 */
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
Book1.subject = "C Programming Tutorial";
Book1.book_id = 6495407;
/* book 2 详述 */
Book2.title = "Telecom Billing";
Book2.author = "Zara Ali";
Book2.subject = "Telecom Billing Tutorial";
Book2.book_id = 6495700;
/* 打印 Book1 信息 */
Console.WriteLine( "Book 1 title : {0}", Book1.title);
Console.WriteLine("Book 1 author : {0}", Book1.author);
Console.WriteLine("Book 1 subject : {0}", Book1.subject);
Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);
/* 打印 Book2 信息 */
Console.WriteLine("Book 2 title : {0}", Book2.title);
Console.WriteLine("Book 2 author : {0}", Book2.author);
Console.WriteLine("Book 2 subject : {0}", Book2.subject);
Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);
}
}
3、C#和C++相比结构体的独有用法
- 结构可带有方法、字段、索引、属性、运算符方法和事件。
- 结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。
- 结构可实现一个或多个接口。
- 结构成员不能指定为 abstract、virtual 或 protected。
- 当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。
- 如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。