声明结构的形式
1.
struct point{
int x;
int y;
};
struct ponit p1,p2;
//p1,p2都是point,里面都有x,y的值
2.
struct{
int x;
int y;
}p1,p2;
//p1,p2都是一种无名结构,里面有x和y
3.
struct point{
int x;
int y;
}p1,p2;
p1,p2都是point,里面都有x,y的值
定义结构变量: struct point p1;
结构的初始化
struct point p1 = {1,0}; 或 struct point p2 = {.x=1};
结构运算
要访问整个结构,直接用结构变量的名字
对于整个结构,可以做赋值、取地址,也可以传递给函数参数
p1 = (struct point){5,10};//相当于p1.x=5; p1.y=10;
p1 = p2; //相当于p1.x=p2.x; p1.y=p2.y;
结构指针
和数组不同,结构变量的名字并不是结构变量的地址,必须用&运算符
struct date *pDate = &today;
结构作为函数参数
int numberofdays(struct date d)
整个结构可以作为参数的值传入函数
这时候是在函数内新建一个结构变量,并复制调用者的结构的值
也可以返回一个结构 这与数组完全不同
注:传入结构和传入数组是不同的,传入结构的是外面那个结构的克隆体,不是指针。
解决办法:可以在输入结构的函数中创建一个临时的结构变量然后把这个结构返回给调用者
不过更好的方式是传指针 指向结构的指针 用->表示指针所指的结构变量中的成员
结构指针参数
结构数组
结构中的结构 (结构的嵌套
联合(union
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。
2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
#include<stdio.h>
union var{
char c[4];
int i;
};
int main(){
union var data;
data.c[0] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~
data.c[1] = 0x03;//写成16进制为了方便直接打印内存中的值对比
data.c[2] = 0x02;
data.c[3] = 0x11;
//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
printf("%x\n",data.i);
}
结果:11020304