C语言之结构体和共用体
算上这篇笔记加上之前的四篇笔记,C语言基础我们也就告一段落了,对于刚刚接触c语言的童鞋们来说,这些以及足够了,稍后我会发布数据结构,对于想要深入学习的童鞋可以继续关注。本人也算一个半吊子的程序员 ,同时也在不断学习。希望我们可以相互学习相互交流,如果有什么不对的地方,可以给我邮件,1509965601@qq.com。看到邮件我会随时回复。
-
结构体
【1】结构体一般形式-
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名n;
} 变量名; -
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名n;
} ;
struct 结构体名 结构体变量名; -
struct
{
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名n;
} 变量名;
【2】:求结构体占用内存大小
sizeof(运算量) 运算量可以是变量、数组、或者结构体变量,可以是数据类型的名称
例如:sizeof(struct 结构体名);
siezof(变量);【3】:结构体变量使用
结构体变量使用一般形式:结构体变量名.成员名【4】结构体初始化
1.struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名n;
} 变量名={成员名1,成员名2,成员名3};2.typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
此方法在函数里面 Book用法如同int【5】结构体包含其他结构体以及包含指向自己类型的指针
此结构体的声明包含了其他的结构体
struct COMPLEX
{
char string[100];
struct SIMPLE a;
};此结构体的声明包含了指向自己类型的指针
struct NODE
{
char string[100];
struct NODE *next_node;
};【6】 如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明
struct B; //对结构体B进行不完整声明
struct A //结构体A中包含指向结构体B的指针
{
struct B *partner;
//other members;
};//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
struct A *partner;
//other members;
};【7】结构体作为函数参数
结构作为函数参数,传参方式与其他类型的变量或指针类似。
void printBook( struct Books book );
void printBook( struct Books book )
{
printf( “Book title : %s\n”, book.title);
}【8】指向结构的指针
1.可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
struct Books *struct_pointer;2.在上述定义的指针变量中存储结构变量的地址。
struct_pointer = &Book1;3.为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符
struct_pointer->title;
【9】 结构体形式使函数返回多个数据+数组
#include<stdio.h>typedef struct
{
int size;
int *t;
} vv;vv fun(vv temp)
{
static a[] = {2,4,5,7,3};
temp.size = sizeof(a)/4;
temp.t = a;
return temp;
}int main()
{
vv p;
int i;
p = fun§;
printf("%d\n",p.size);
for(i = 0;i < p.size;i++)
printf("%d\n",p.t[i]);
} -
【10】共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
1.定义共用体,您必须使用 union 语句,方式与定义结构类似。
union Data
{
int i;
float f;
char str[20];
};
2.存储大小按照最大的成员算。
上述共用体大小为20
**【11】 typedef**
1.为类型取一个新的名字。 typedef unsigned char BYTE; BYTE b1, b2;
2.使用 typedef 来为用户自定义的数据类型取一个新的名字。例如,您可以对结构体使用 typedef 来定义一个新的数据类型名字
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
3.typedef 和 #define的区别
#define 实质是文本替换
#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的