1.结构体的声明
这是结构的开始我们要格外重视
struct tag//tag是这个结构体的名字
{
member//这是成员变量的说
}variable;//首先这个分号一定不可以丢弃的说,其次这是这个结构体的类型
2.特殊的声明
struct
{
int a;
char b;
float c;
}x;//这里我们可以看见这里缺少了结构体的名字的说;
//所以这个就叫匿名结构体类型
struct
{
int a;
char b;
float c;
}a[20],*p;
注意
若出现p=&x这个代码是不可以的,编译器回将上面的代码视为两个不同的类型的说,所以是非法的,如果没有对结构体类型重命名的话,这个结构体就会被覆盖;
3.结构的自引用
struct Node
{
int data;
struct Node net;
};
这里我们可以想象一下这个结构体会在内存中不断地开辟空间的说
你就会发现这时编译器就会报错呢;
但是当你加上*的时候就会不报错的说,
所以一个结构体内不可以包含一个同样大小的结构体变量
还有例如呢
typedef struct
{
int data;
struct Node* next;
}Node;
//这种代码也是不行的,Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。
//所以加以修改的说
typedef struct Node
{
int data;
struct Node* next;
}Node;
//每次都不要使用匿名结构体的说
4.对于结构变量的创建和初始化
struct Point
{
int x;
int y;
}p1;//声明类型的同时定义变量p1;
struct Point p2;//定义结构体变量p2;
struct Stu
{
char name [15];
int age;
};//声明
struct Stu s={"zhangsan",20};//初始化
//同样结构体也可以嵌套的说
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1={10,{4,5},NULL};
//在指示器初始化方式(C99),这种方式允许成员不按照顺序初始化
5.结构成员访问操作符
1.一般情况下访问操作符有两个一个是.,一个是->
主要是因为是否为指针类型的说
#define _CRT_SECURE_NO_WAENINGS 1
#include<stdio.h>
#include <string.h>
struct Stu
{
char name[15];
int age;
};
void print_stu(struct Stu s)
{
printf("%s %d", s.name, s.age);
}
void set_stu(struct Stu* ps)
{
strcpy(ps->name, "李四");
ps->age = 28;
}
int main()
{
struct Stu s = { "张三",20 };
print_stu(s);
set_stu(&s);
print_stu(s);
return 0;
}
6.结构体的内存对齐
这是一个非常热门的考点呢
#include <stddef.h>
#include <stdio.h>
struct S3
{
double d;
char c;
int i;
};
struct S4
{
char c1;
struct S3 s3;
double d;
};
int main()
{
printf("%zd\n", sizeof(struct S3));//?
printf("%zd\n", sizeof(struct S4));//?
return 0;
}
这是结构体s3的内存
这
这是结构体s4 在内存中的存储方式!
#include <stddef.h>
#include <stdio.h>
struct S3
{
double d;
char c;
int i;
};
struct S4
{
char c1;
struct S3 s3;
double d;
};
int main()
{
//printf("%zd\n", sizeof(struct S3));//?
//printf("%zd\n", sizeof(struct S4));//?
//offsetof();//宏 - 用来计算结构体成员,相较于起始位置的偏移量的
printf("%zd\n", offsetof(struct S4, c1));
printf("%zd\n", offsetof(struct S4, s3));
printf("%zd\n", offsetof(struct S4, d));
//这里的offsetof是函数用于计算偏移量的
return 0;
}
到这里就结束喽,谢谢大家观看哦!😘😘😘😘