一、结构体类型
1、构造结构体类型
struct 结构体类型名{成员1的定义;成员2的定义;……..成员n的定义;};
如:
struct student{ int sn;int age;char sex;int s[3];};注:(1)定义成员的方式与定义普通变量的方式一样。(2)成员列表必须用一对 花括号 括起。(3) 结构体名可以省略 。
2、定义结构体变量
A.先定义(构造)结构体类型名再定义结构体变量
main(){struct student{ int sn;int age;char sex;int s[3];}; /*类型定义*/struct student stu1,stu2,st[25]; /* 变量定义 */
B.在定义结构体类型的同时可以定义结构体变量
struct student{ int sn;int age;char sex;int s[3];} stu1,stu2,st[25];
C.类型、变量同时定义,类型名student省略。(不推荐)
struct{ int sn;int age;char sex;int s[3];int *p;} stu1,stu2,st[25];不能再定义变量
考研主要题型
(1)结构体变量在内存中占用字节数为各成员占用字节数总和。
例1
例2
3、结构变量的初始化及引用
使用结构体变量、结构体数组、结构体、指针变量
(1)在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中,来进行对结构体变量的初始化。若初值个数多于成员个数则出错,若初值个数少于成员个数,则多余成员自动赋0。
struct aa{ int a;char b[10];//字符数组,字符串float c;} a1={30,"china",40.5},a2={60,"kunming"},a3;
(2)结构体变量
不能整体引用
,只能
引用
它的
成员
。(
同数组
相似)
引用结构体成员的方式:
结构体变量名 . 成员名其中( . )为成员运算符。
如:
printf(“a1=%d,%s,%f”, a1 ); 非法printf("a1=%d,%s, %f ",a1.a ,a1.b, a1.c );a1.a=80;a1.b="xinjiang"; 非法 (数组名不能在赋值号的左边) (strcpy(a1.b,"xinjiang"));a1.c=60.5;
4、指向结构体数据类型的指针
(1)指向结构体变量的指针
可以用指针变量指向结构体变量,也可能用指针变量指向结构体变量中的成员。要注意指针变量的类型必须与它所指向变量的类型相同。当指针变量指向结构体变量时,对指针变量加1则跳过整个结构体而不是跳过一个成员。
例
例
续
(2)指向结构体数组的指针
注:( 1 )可以用结构体变量的 成员作为实参 ,它与普通变量作为实参的用法是一样的。(2)用 结构体变量作为实参 时,要求 形参 必须是 同一结构体类型 的变量,传递后形参与实参各 对应成员值 是 一样 的。(3)也可以用 结构体类型的地址 (指针变量或数组) 作为实参 ,要求形参必须是同一结构体类型的指针变量或数组。只要是地址传递,则可以通过形参来改变实参的值。
二、链表
(1)链表概述
- 由于链表中的结点是一个结构体类型,并且结点中有一个成员用于指向下一个结点。所以定义作为结点的格式:
struct 结构体名{ 定义数据成员;struct 结构体名 * 指针变量名;};
- 结点——>struct——>指向自身的指针
(2)动态存储分配函数<stdlib.h>
#include<stdlib.h>
(2.1)malloc()函数
格式: malloc(size)
作用是在内存的动态存储区中分配一个长度为
size个字节
的连续空间,函数返回值为一个指向分配域起始地址的指针若分配失败则返回NULL
例如:开辟一个用于存放 struct student 数据的内存空间,并让 p 指向该空间:struct student *p=(struct student *)malloc(sizeof(struct student ));malloc申请的是地址,地址应该给地址变量,地址变量是有类型的,强制转换成和指针变量*p一致的类型
(2.2)free()函数
格式: free(p);
作用是
释放
用
malloc()
分配的内存。
3.链表操作
(1)建立动态链表
(2)访问链表
3.链表结点的删除
a
、删中间
b
、删第一个
c
、删最后一个
4.增加结点
a
、请将结点
c
插入结点
a
和
b
之间,插入后
a
、
c
、
b
形成新链表。
b
、请将结点
c
插到已有链表的末尾,使其成为新链表的尾结点。
c
、请将结点
c
插到已有链表的前面,使其成为新链表的头结点并让head
指向新的头结点。
三、共用体类型
共用体中的所有成员共用同一段内存(所有成员的起始地址都是一样的)
格式:union 共用体名{成员列表;} ;
注:( 1 )成员列表为定义该共用体的成员,成员定义的方式与普通变量的方式一样。(2)成员列表必须用一对 花括号 括起。(3) 共用体(类型)名可以省略
1、共用体变量的定义
(1)
先定义类型,再定义变量
(2)
定义类型的同时,定义变量
(3)
直接定义变量
注:
由于共用体类型变量的所有成员都共用同一段内存,所以共用体类型变量所占的字节数等于该共用体类型中占用字节数
最多的成员所占的字节数
。
sizeof(a1)=>10其中i占前两个float占前四个数组占十个他们首地址相同
2、共用体变量的引用
注:
(
1
)不能整体引用共用体变量,只能引用其成员。
引用的格式: 共用体变量名 .成员名
(2)
同类型成员共享值
(3)在内存中整型数据的二进制数低8
位占用前面一个字节,高
8
位占用后面一个字节。
整数 255, 在内存中的存储形式为:11111111 00000000一个字符型数据占用一个字节,对于数组来说前面元素占用前面的字节。
(4)
共用体变量之间可以相互赋值,赋值后两个变量应使用同一成员。
(5)
共用体变量的地址与各成员的地址都相同的。
(6)
在定义共用体时,可以对其进行初始化,但只能有一个初值且必须用花括号将初值括起。相当于给第一个成员赋值。
(7)
共用体、结构体的成员均可以是共用体或结构体类型。
(8)不能用共用体类型变量做为函数参数。
(9)
计算共用体占用字节数。
四、、typedef
用
typedef
定义新类型名
在编程中可以用
typedef
来定义新的类型名来代替已有的类型名
格式:
typedef 已有类型名 新的类型名;如: typedef int INTEGER;以后在定义变量时 int 和 INTERGER 是等价的。
注:
1、不能定义变量2、不能造类型
例题: