C语言结构体点滴

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

1、在C语言中,要创造一个全新的数据类型,首先要定义这么一个类型。告诉编译器这个新类型由哪些基本类型组成。标准的定义形式如下:

struct book

{

int price;

char title[44];

};

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

2、定义结构体变量

有了类型就可以定义变量。如:

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];

};

3、初始化

可以这样:

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赋值。

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

4、赋值

赋值和初始化是不同的(多么痛的领悟啊)!!!!!

结构体基本上没有赋值这一说,比如下面的做法是错的:

struct book a;

a = {.title = "agv", .price = 43.5};

数组也是这么规定的。但是结构体变量之间可以相互赋值,比如:

struct book a,b;

a = b;

当然也仅止步于局部变量。

5、访问成员变量

两个符号: . 和 ->,组合起来有三种方式。

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,只不过->专门用于指针,而.用于结构变量本身罢了。

基本内容就这么多了,以后会继续补充。

C语言结构体点滴

时间: 2024-10-18 03:09:24

C语言结构体点滴的相关文章

C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行) 追问 为什么不能直接赋值啊, 追答 用char nnnn[20]定义的,用strcpy 用char *ppp定义的,用=来赋值 C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

漫谈C语言结构体struct、公用体union空间占用

先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; union union_data1{ short a;//本身占用2个字节 char b[13];//本身占用13个字节 int c ;//本身占用4个字节 }; struct struct_data{ int a ;//int本身占用4个字节,偏移量为0 char b ;//char本身占用1个字节,偏移量为

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

C语言结构体(struct)常见使用方法(转)

本文转自 CSDN huqinweI987 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 [cpp] view plaincopy struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp] view plaincopy

C语言结构体赋初值

C语言结构体赋初值,特别是结构体中含有数组成员是,最后一个逗号最好是不要多写.因为有些时候可能会出错.图中,红色的框框处.

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

c 语言 结构体

结构体初学者都有点小怕其实思维清晰之后你会发现结构体是个非常好的东西,嘿嘿. 第一,结构体的定义和初始化.别被书上大量的描述吓到 1.怎么定义结构体了例子如下,我们以构建一个包含学生姓名,年龄,Email为例子 1 struct 2 { 3 char name; 4 int age; 5 char Email; 6 }person; 现在我们定义就已经完成了,当然这是我最喜欢的范式,你们也可以在书上找到自己喜欢的. 2.怎么初始化了?结构体一般初始化都是以结构体数组的形式来的所以我们只说这个 t

C语言结构体的初始化

今天在工作时,看到了奇葩的结构体初始化方式,于是我查了一下C99标准文档和gcc的说明文档,终于搞清楚是怎么回事了. 假设有如下结构体定义: typedef struct { int a, b, c; } MyStruct; 那么结构体的初始化方式如下有三种: (1) C89的初始化方式 MyStruct test = {1, 2, 3}; 这种初始化的优点是语法简单,无需输入变量名:缺点是成员变量的初始化顺序必须与声明的一致,无法乱序初始化. (2) C99新增的初始化方式 MyStruct

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个