结构体及其应用:认识结构体

本文详细介绍了结构体在C语言及C++中的定义、声明及应用,并通过实例对比了值传递与指针传递的不同效果。

1、结构体作为一种数据结构,可以灵活的用来表示多种数据的集合,不仅仅在C语言中应用广泛,在C++中也 是颇为常见。

2、结构体在C语言中和C++中有着一定的区别,主要是结构体的定义形式上会有一定的差别,这一点会在后面 的例子中提及

3、在C++中结构体也是作为面向对象来使用的,struct 和class 的区别在于struct 默认其数据成员和成员函数为公有,而class默认其数据成员为私有的。所以能够使用class的        地方都可以使用struct进行代替使用,具体使用哪一种,那就看你的喜好了。

4、结构体在C语言中的声明和定义:

      1)、结构体的形式: 

struct book{
char author[20];
char ISBN[20];
double sale;
}

     2)、结构体的声明和定义:

           结构体的声明和定义有三种形式:第一种便是上面所提到的,

       

struct book{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;
struct book ChineseBook,EnglishBook;



           我们也可以声明和定义无名结构体:  

struct{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;



        无名结构体在声明的时候不添加名字,直接在末尾添加上结构体变量,这种用法有一定的局限性,灵活添加变量。也就是说,一旦声明结束,我们想重新定义一个该结构体类型的变量时,就行不通了。不能像第一个那样,在程序中使用 struct book ChineseBook,EnglishBook;
 来定义新的变量。

 

使用typedef 来声明和定义结构体:

<pre name="code" class="cpp">typedef struct book{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;
book ChineseBook,EnglishBook;



注意看使用typedef和第一方式的区别,使用typedef定义的结构体,在定义新的变量时不需要再加上关键字struct。

5、结构体在C++中的定义和声明

1)、在C语言中的定义方式在C++之中均行的通。

2)、在C++中定义结构体时,上面说到的第一种和第三种方式没有区别,这是编译器对语言进行的优化,这一点我们得感谢伟大的编译 器。也就是说在C++中,第一种方式可以按照下面的形式来定义变量:

struct book{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;
book ChineseBook,EnglishBook;

3)、在C++中可以在struct内部加上关键字 public,private,protected,这一点后续会讲到。

6、结构体的应用

结构体主要有两方面的应用:结构体做函数参数,使用结构体来创建新的数据结构。这篇文章先讲一讲使用结构体做函数参数。先看一下例子:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct _Teacher{
	char szName[20];
	int age;
	char *p;
}Teacher;

int ChangeStruct(Teacher t1, Teacher t2)
{
	memcpy(&t2, &t1, sizeof(Teacher));
	return 0;
}

int ChangeStruct1(Teacher *t1, Teacher *t2)
{
	memcpy(t2, t1, sizeof(Teacher));

	return 0;
}

void main()
{
	Teacher t1;
	Teacher t2;
	t1.age = 20;
	memset(t1.szName, 0, sizeof(t1.szName));
	strcpy_s(t1.szName, sizeof(t1.szName), "Beautiful Lady");
	t1.p = NULL;

	t2.age = 10;
	memset(t2.szName, 0, sizeof(t2.szName));
	t2.p = NULL;

	ChangeStruct(t2, t1);
	printf("%d\n", t2.age);
	printf("%s\n", t2.szName);

	ChangeStruct1(&t1, &t2);
	printf("%d\n", t2.age);
	printf("%s\n", t2.szName);

	system("pause");
}
 
程序运行的结果如下:


解释一下这个程序的意图:想要将第一个结构体的内容拷贝给第二个结构体,int ChangeStruct(Teacher t1, Teacher t2)是按值传递,
int ChangeStruct1(Teacher *t1, Teacher *t2)传递的则是一个结构体的指针。然后运行程序后发现,第一个函数并没有达到我们想要的目的,第二个函数达到了。这其    实和要交换两个数的值swap(int *,int *)的原理一样,这一点大家自己去琢磨。
 
还有一点需要注意的是:两个结构体之间可以直接赋值,也就是 我们可以使用 t2 = t1;来操作。但是我为什么没有这样做呢,后面一节会给大家带来详细的解答,同时也希望大家不要这样做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值