9、C语言——结构体

结构体

构造-定义-使用
构造类型——结构体类型
类型是用来定义变量的
结构体类型
使用结构体变量、结构体数组、结构体指针变量
一、结构体类型
1、构造结构体类型
struct 结构体类型名——遵循用户的标识符
{
成员1的定义
成员2的定义
......
成员n的定义
};
eg:
struct student
{
int sn;
int age;
char sex;
int s[3];
};此处的分号不能省略·
struct 是构造结构体类型的标志
其中的student不是变量名,是构造的体类型名,它和int float一样是某一种类型
{}中是成员列表
结构体与数组的最大区别是,结构体的成员可以是不同的类型,也可以是相同的类型,但是数组的成员必须是相同的类型
1)定义成员的方式与定义普通变量的方式一样
2)成员列表必须用一对花括号括起来
3)结构体名(结构体类型名——student)可以省略

因为现在存在类型,故可以用类型来定义变量
定义变量有如下几种形式

2、定义结构体变量
A先定义(构造)结构体类型名,然后用该类型去定义结构体变量
struct student
{
int sn;
int age;
char sex;
int s[3];
};
struct student str1, str2, str[10];
注:str1,str2是变量,而str[10]是数组
struct student是一种类型
B在定义结构体类型的同时可以定义结构体变量
struct student
{
int sn;
int age;
char sex;
int s[3];
}str1, str2, str[10];
C类型、变量同时定义,类型名student省略,之后不能再定义这种类型的变量了
struct
{
int sn;
int age;
char sex;
int s[3];
}str1, str2, str[10];不好,不推荐使用
注:
1)结构体变量在内存中占用字节数为各成员占用字节数总和

3、使用结构体变量、结构体数组、结构体指针变量
结构变量的初始化(类似数组)及引用
struct aa
{
int a;
char b[10];
float c;
}a1={30,"china",40.5},a2={60,"kunming"},a3;
1)再定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中,来进行对结构体变量的初始化,若初值个数多于成员个数则出错,若初值个数少于成员个数,则多余成员自动赋0
2)结构体变量不能整体引用,只能引用他的成员
a1.b="xinjiang"是非法的,数组名是常量,常量不能放在赋值号的左边,若要给数组名赋字符串需要借用strcpy函数
引用结构体成员的方式:
结构体变量名.成员名
其中(.)为成员运算符

4、指向结构体数据类型的指针
struct student
{
int num;
char name[20];
char sex;
float score;
};
struct student aa={1001,"zhang",‘M‘,80.5}
struct student *p=&aa;
char *q=aa.name;
int *r=&aa.num;
aa虽然是结构体类型的变量,但是它还是内容变量
1)指向结构体变量的指针
可以用指针变量指向结构体变量也可用指针变量指向结构体变量中的成员。要注意指针变量的类型必须与他所指向变量的类型相同。当指针变量指向结构体变量时,对指针变量加1则跳过整个结构体而不是跳过一个成员
2)指向结构体数组的指针
注:
1)可以用结构体变量的成员作为实参,它与普通变量作为实参的用法是一样
2)用结构体变量作为实参时,要求形参必须是同一结构体类型的变量,传递后形参与实参各对应成员值是一样的
3)也可以用结构体类型的地址(指针变量或数组)作为实参,要求形参必须是同一结构体类型的指针变量或数组。只要是地址传递,则可以通过形参来改变实参的值
struct student
{
int num;
char name[20];
char sex;
float score;
};
struct student stu[3]={{1001,"zhang",‘M‘,80.5},{1002,"zhang",‘M‘,80.5},{1003,"zhang",‘M‘,80.5}} ;
struct student *p=stu;
外看是数组,内看是结构体
结构体不能整体使用赋值除外
二、链表
顺序存储是随机访问
链式存储是顺序访问
数据集{定义数组/定义链表}
数组连续的存储空间,方便的访问,不方便插入与删除
链表必须形成结点,/定义结点,不必连续,/动态机制,结点用结构体来构造生成一个链表
3个操作——访问、插入、删除
链表的访问都是通过指针变量从头结点开始
每一个结点都应包括数据部分和下一个结点的地址两部分内容

2)动态村村民分配函数<stdlib.h>
1、malloc()函数
格式:malloc(size)
作用是在内存的动态存储区中分配一个长度为size个字节的连续空间,函数返回值为一个指向分配域起始地址的指针若分配失败则返回null
sizeof 求一个变量所对应类型或者类型在内存中的所占有的字节数
返回的地址是void*类型,如果要使用该地址则必须强制转换成所指向地址的类型
2、free()函数
格式:free(p)
作用是释放用malloc分配的内存

三、共用体类型
共用体中的所有成员共用同一段内存(所有成员的起始地址都是一样的)
格式:
union 共用体名
{
成员列表;
};
注:成员列表为定义该共用体的成员,成员定义的方式与普通变量的方式一样
成员列表必须用一对花括号括起
共用体名可以省略
如:
union data
{
int i;
char ch[19];
float s;
};
定义了一个名data的共用体类型,该类型有三个成员
共用体变量的定义
1)先定义类型,再定义变量
2)定义类型的同时,定义变量
3)直接定义变量
union data
{
int i;
char ch[19];
float s;
};a1
注:
由于共用体类型变量的所有成员都共用同一段内存,所以共用体类型变量所占的字节数等于该共用体类型中的成员所占用字节数最多的成员所占的字节数。
2、共用体变量的引用
注:
1)不能整体引用共用体变量,只能引用其成员
引用的格式:
共用体变量名.成员名
2)同类型成员共享值
3)在内存中整型数据的二进制低8位占用前面一个字节,高8位占用后面一个字节
一个字符型数据占用一个字节,对于数组来说前面元素占用
4)共用体变量之间可以相互赋值,赋值后两个变量应使用同一成员
5)共用体变量的地址与各成员的地址都相同的
6)在定义共用体时,可以对其进行初始化,但只能有一个处置且必须用花括号将处置括起。相当于给第一个成员赋值
7)共用体、结构体的成员均可以是共用体或结构体类型
8)不能用共用体类型变量做为函数参数
9)计算共用体占用字节数
四、typedef
用typedef定义新类型名
在编程中可以用typedef来定义新的类型名来代替已有的类型名

格式:
typedef 已有类型名 新的类型名;
如:
typedef int INTEGER
以后在定义变量时int和INTEGER是等价的

typedef可以用于定义各种类型名,但不能定义变量,即只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名
typedef只能对已经存在的类型新增一个别名,而不是创造新类型,即在typedef后必须是一个已有的类型

时间: 2024-11-08 22:24:33

9、C语言——结构体的相关文章

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

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 /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

C语言结构体声明中冒号的使用(占位符) &amp; C结构体的乱序初始化

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示.一.位 域的定义和位域变量的说明位域定义与