C语言结构体点滴

结构的本质是C语言的一种数据抽象,通俗的说,是基本数据类型的重组。为何要重组呢?由于基本数据类型不够用了。为何不够用了呢?由于须要的信息类型太多了。这是一个很大的话题。信息原本是没有什么类型之分的,可是为了便于在计算机内部的管理,人们在C语言中把信息先分红了基本的几个类型,好比整型、浮点型、字符型、布尔型等等。可是呢,描述一个事物的所有信息有时候仅用一种基本类型是不够的,好比一本书的基本属性:做者(字符型)、价格(浮点型)、出版日期(我也不知道什么型)、书名(字符型)。然而操蛋的是,咱们要处理的并不是是这本书的某个属性,而是总体,这时候咱们只好把各类类型组合起来构造一种全新的数据类型——这正是发挥咱们想象力和创造力的时候。除了基本类型之外并由其组合而成的新类型统称为结构体。数组

 

一、在C语言中,要创造一个全新的数据类型,首先要定义这么一个类型。告诉编译器这个新类型由哪些基本类型组成。标准的定义形式以下: 
struct book
{
int price;
char title[44];
};ide

首先是关键字struct,代表这不是一个基本类型;而后是一个标记(tag),至关于给新类型起的名字,可是这个名字并不是必须的,下面会谈到为何写上比较好;最后是新类型的成员,须要放在花括号里面且代表基本数据类型。须要注意的是,末尾须要加上分号,由于这只是类型定义,属于一种声明,声明都要以分号结尾。类型定义并不分配内存空间,他只是创造了一个模版,之后用这个模版定义变量的时候才真正的分配内存。指针

 

二、定义结构体变量
有了类型就能够定义变量。如:
struct book 
{
int price;
char title[44];
} a, b;
a和b被定义为struct book类型的变量,而后按照模版分配内存空间。
也能够这样定义变量:
struct
{
int price;
char title[44];
} a; 

以上两张形式的定义区别在于:一个有tag一个没有。但不管哪种都略显臃肿,尤为是成员众多的时候。这时,tag的做用就显示出来了,咱们能够简化定义的形式:
struct book a, b;
注意struct不能省略,tag必须和struct一块儿使用,才能至关于int、float等基本类型。而没有tag直接定义变量的形式就不能享受这种便利了。并且tag的做用并不是仅限于简化定义形式,实际上,只有定义了tag,这个模版(新类型)才能够被反复使用(即定义变量)而不引发混淆。像下面这样:
struct
{
int price;
char title[44];
} a; 


struct
{
int price;
char title[44];
} *b; 


要注意两个结构体是不一样的,至少在编译器眼里是不一样的,即便他们的成员同样。好比 b = &a; 这是非法的。而有了tag就能够避免这样的混淆——tag能够把成员相同的结构默认为同一种类型。
另外,不加tag的形式只能在定义变量的时候使用,换言之,下面的类型定义(声明)是没有意义的:
struct
{
int price;
char title[44];内存

};编译器

 

三、初始化
能够这样:
struct book a = {43.5, "agv"};
成员之间用逗号隔开,同时成员顺序要和模版保持一致,即类型要匹配。若是成员比模版声明的要多就会报错;若是少于模版数量,未指定值的项目会被置为0或空;多余的逗号不会报错。
也能够这样:
struct book a = {.title = "agv", .price = 43.5};
这种形式就没必要按照模版的顺序赋值,可是要注意一点,若是这样:
struct book = {.title = "agv", .price = 23.1, "ree"};
那么最后title的值究竟是多少?答案是“ree”,先前的会被后来的覆盖。由于title的确是在price以后的,price赋值后很天然的继续给title赋值。

it

初始化的时候,若结构体变量是全局变量,则必须使用常量表达式初始化成员;若结构体是局部变量,则能够是变量表达式初始化成员。编译

 

四、赋值
赋值和初始化是不一样的(多么痛的领悟啊)!!!!!
结构体基本上没有赋值这一说,好比下面的作法是错的:
struct book a;
a = {.title = "agv", .price = 43.5};


数组也是这么规定的。可是结构体变量之间能够相互赋值,好比:
struct book a,b;
a = b;
固然也仅止步于局部变量。
五、访问成员变量
两个符号: . 和 ->,组合起来有三种方式。
struct book a;
printf("a.title\n");


struct book *b;
b = &a;
printf("b->title\n");


struct book *b;
b = &a;
printf("(*b).title\n");


这里显然有b->title == a.title,只不过->专门用于指针,而.用于结构变量自己罢了。


基本内容就这么多了,之后会继续补充。如今植发是通常须要多少class

相关文章
相关标签/搜索