c语言 结构和联合
Posted 万物皆为二叉树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 结构和联合相关的知识,希望对你有一定的参考价值。
自定义类型
结构体
结构体基础知识
- 结构体和数组的差别
- 创建一个结构体
struct student //学生的数据类型
char name[10];
int age;
;
也可以创建结构体指针 和结构体数组
struct student* p; //结构体指针 ++跳过一整个结构体
struct student arr[10]; // 结构体数组 存放10个
- 结构体的访问
注意:
#include<stdio.h>
struct student
char name[20];
int age;
x,*p;
int main()
if (p == &x)
printf("haha");
return 0;
这里的 p和&x 不一样
p是个结构体指针 但是他是一个空指针 等价与以下这种行为
int a;
&x 是x的地址 用结构体指针保存后 是一个指向x的结构体指针。
- typedef的使用
typedef 可以简化一个结构体变量名称
typedef struct book
char name[10];
int price;
book;
int main()
book x[10] = 0 ;
return 0;
现在 book 就是一个结构类型。
- 结构体 的直接访问
typedef struct book
char name[10];
int price;
book;
int main()
book x[10] = 0 ;
x[1].name[10] = "abcd"; //通过 点操作符访问
return 0;
- 通过指针间接访问
typedef struct
char name[10];
int price;
book;
void fun(book* pc)
pc->price =10;
printf("%d",pc->price);
int main()
book x[10] = 0 ;
fun(x);
return 0;
结构体指针
struct stu
char name[10];
int age;
;
int main()
struct stu *p;
return 0;
p是一个指向结构体的指针 p+1 可以跳到下一个结构体
*p+1这是非法操作
*p 和p *P 是整个结构体 p是一个结构体指针
#include<stdio.h>
struct stu
char name[10];
int age;
x;
int main()
struct stu *p=&x;
p->age = 10; // 可以这样 指针指向
(*p).age=10; // 可以解引用得到 x
return 0;
- 结构体指针访问 嵌套结构体
#include<stdio.h>
struct stu
int arr[2];
int age;
;
struct ptu
int a;
int b;
struct stu sr ;
s;
int main()
struct ptu* p = &s;
p->sr.age;
return 0;
结构体的内存分配
首先 这个代码会输出什么呢?
struct S1
char c1;
int i;
char c2;
;
int main()
printf("%d\\n", sizeof(struct S1));
return 0;
输出 12 不应该是 1+4+1=6嘛 可见 结构体内存存放不一样
12. 第一个成员在与结构体变量偏移量为0的地址处。
13. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
Linux中的默认值为4
14. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
15. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍
16. 结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。
绿色 char 蓝色 无用内存 红色 int
位段
#include<stdio.h>
struct pc
int a : 2; //2表示所占字节数
;
int main()
return 0;
联合
戳这里联合
以上是关于c语言 结构和联合的主要内容,如果未能解决你的问题,请参考以下文章