【C语言】结构体概念、结构体指针、特殊的声明。

时间:2023-02-20 11:19:53


????write in front????   

????大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流????

????2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星TOP100~2022博客之星TOP63~作者周榜84﹣作者总榜704~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量50w+????

????本文由 謓泽 原创 如需转载还请通知⚠

????个人主页-​謓泽51Ctop的博客​????

????欢迎各位→点赞???? + 收藏⭐️ + 留言????

????系列专栏-​謓泽51Ctop的博客_【C语言】从0~1_51CTO博客​????
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本????

【C语言】结构体概念、结构体指针、特殊的声明。

 结构体概念

在这里用简短的话先说说结构体↓

结构体实际上是一些值的集

合,结构的每个成员是不同的变量。所以在这里结构体实际上也是复杂对象类型称之为构造类型,我觉得可以把这个构造类型看成是一个项目的总共。而基本类型就是小的项目。

而在这里很多人可能会联想到数组,但是数组是一组相同类型的元素集合。而我们结构体可以是不同类型的元素的集合。在这里用玩具盒子来表示结构体名,用其它玩具表示每个不同の成员,如下图所示:↓ 

【C语言】结构体概念、结构体指针、特殊的声明。

上述在这里书是一个复杂对象,我们要创建书的类型那么就是一个结构体类型。

那么我们来写一个"书"的结构体类型代码。如 ↓ 所示

#include<stdio.h>
typedef struct BOOK
{
char book_title[20];
char name[20];
char PH[20];
int Pricing;
int id;
}BOOK;
int main(void)
{
BOOK s = { "xxxxx", "张三", "aaaaa", 20, 123456 };
printf("book_title:%s\n", s.book_title);
printf("name:%s\n", s.name);
printf("PH:%s\n", s.PH);
printf("Pricing:%d\n", s.Pricing);
printf("id:%d\n", s.id);
return 0;
}

运行结果 ↓

book_title:xxxxx
name:张三
PH:aaaaa
Pricing:20
id:123456 

结构体指针 

struct stu* p;【C语言】结构体概念、结构体指针、特殊的声明。

如上述代码这是一个结构体指针变量说明结构体指针变量p指向(->)的是一个结构体类型变量地址也就是保存x的地址。

注意:(->)指向操作符是一种通过指针的方式去访问结构体内的成员一种便捷写法的反方式。

示例代码如下↓

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//结构体类型制作
struct stu
{
int id;
char c;
}*p;
int main(void)
{
struct stu age = { 18,'C' };//结构体变量以及初始化
p = &age; //结构体指针
printf("id:%d\n", p->id);
printf("c:%c\n", p->c);
return 0;
}

运行结果????

id:18

c:C


特殊的声明 

在声明结构体的时候,实际上可以不完全的进行声明。

struct 
{
char book_title[20];
char name[20];
char PH[20];
int Pricing;
int id;
}BOOK;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct
{
int id;
char c;
}BOOK;
int main(void)
{
printf("%d\n", BOOK.id = 18);
printf("%c\n", BOOK.c = 'c');
}
运行结果:18
c

上述代码是个什么意思,实际上就是我们的结构体名是没有起名字的。但是整体来说我选中的还是依旧是一个结构体类型,那么这种叫做什么呢? → 匿名结构体类型

注意????:匿名结构体创建完之后只能使用一次,具有局限性。

而用这个匿名结构体类型我们是直接创建了一个全局变量BOOK,和前面代码当中是一个意思只不过我们把结构体的标签也就是结构体当中的名给省略掉了。

那么下面再来说说匿名结构体指针,如下代码所示 ↓

struct 
{
char book_title[20];
char name[20];
char PH[20];
int Pricing;
int id;
}*BOOK1;

*是匿名结构体的指针,用指针类型创建了BOOK1,那么此时我们可以用 BOOK1 = &BOOK吗?如 ↓ 代码所示:

#include<stdio.h>
struct
{
char book_title[20];
char name[20];
char PH[20];
int Pricing;
int id;
}BOOK;
struct
{
char book_title[20];
char name[20];
char PH[20];
int Pricing;
int id;
}*BOOK1;
int main(void)
{
BOOK1 = &BOOK;
return 0;
}

在这里编译器会出现一个警告,如果你强行这样去写也是运行的过去の。 

【C语言】结构体概念、结构体指针、特殊的声明。

在这里看来,编译器虽然你们当中的结构体成员变量都是一模一样的,但编译器还是会认为这两个是不同的类型。那么 *BOOK1 就不能存放 BOOK 的地址了。