C语言自定义类型详解


C语言自定义类型

一:结构体

1.为什么要使用结构体?

C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学生,描述⼀本书,这时单⼀的内置类型是不行的。描述⼀个学生需要名字、年龄、学号、身高、体重等;描述⼀本书需要作者、出版社、定价等。C语言为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以自己创造适合的类型。

结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚⾄是其他结构体。

2.结构体的声明:

(1)一般声明:

描述一个学生:

struct Stu
{
   
     char name[20];//名字
     int age;//年龄
     char sex[5];//性别
     char id[20];//学号
}; //分号不能丢
(2)特殊声明:

在声明结构的时候,可以不完全的声明,这种结构体被称为匿名结构体。
比如:

struct
{
   
	int a;
	char b;
	float c;
}x;
struct
{
   
	int a;
	char b;
	float c;
}a[20], * p;

上面的两个结构在声明的时候省略掉了结构体标签。

那么问题来了?
在上面代码的基础上,下面的代码合法吗?

p = &x;

在这里插入图片描述
从上面结果中我们能够看出:会出现警告:“ = ”:从 “ * ” 到 “ * ” 的类型不兼容

警告:
编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。
匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。

3.结构体变量的定义和初始化:

struct Point
{
   
	int x;
	int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2

//代码2:初始化
struct Point p3 = {
    10, 20 };
struct Stu //类型声明
{
   
	char name[15];//名字
	int age; //年龄
};
struct Stu s1 = {
    "zhangsan", 20 };//初始化
struct Stu s2 = {
    .age = 20, .name = "lisi" };//指定顺序初始化

//代码3
struct Node
{
   
	int data;
	struct Point p;
	struct Node* next;
}n1 = {
    10, {
   4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = {
    20, {
   5, 6}, NULL };//结构体嵌套初始化

4.结构成员访问操作符:

(1)结构体成员的直接访问

结构体成员的直接访问是通过点操作符(.)访问的。点操作符接受两个操作数。如下所示:

#include <stdio.h>
struct Point
{
   
	int x;
	int y;
}p = {
    1,2 };
int main()
{
   
	printf("x: %d y: %d\n", p.x, p.y);
	return 0;
}

使用方式:结构体变量 . 成员名

(2)结构体成员的间接访问

有时候我们得到的不是⼀个结构体变量,而是得到了⼀个指向结构体的指针。如下所示:

#include <stdio.h>
struct Point
{
   
	int x;
	int y;
};
int main()
{
   
	struct Point p 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_XiangYu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值