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;来操作。但是我为什么没有这样做呢,后面一节会给大家带来详细的解答,同时也希望大家不要这样做。
本文详细介绍了结构体在C语言及C++中的定义、声明及应用,并通过实例对比了值传递与指针传递的不同效果。

1122

被折叠的 条评论
为什么被折叠?



