关于结构体的使用

本文介绍了C语言中结构体的定义,如何使用结构体描述复杂数据,以及typedef关键字的作用,包括为基本类型、自定义类型、数组和指针定义简洁的别名,以提高代码的可读性和维护性。
摘要由CSDN通过智能技术生成

1结构体的定义

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

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

2结构的声明

struct tag
{
member-list;
member-list;
}variable-list;

 例如,用结构体来描述一个学生的信息:

struct Stu//创造出一个新的类型(自定义类型)
{
char name[20];//姓名
int age;//年龄
char sex[5];//性别
char id[20];//学号
};//这里的分号不能丢

 例如:

int main()
{
struct Student s1;
struct Student s2;
struct Student s3;
//s1,s2,s3是三个结构体变量(局部)
return 0;
}s4;//s4是全局变量

struct Student s7//全局

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

//代码1:变量的定义
struct Point
{
	int x;
	int y;
 } p1;//声明类型同时定义变量p1 
 struct Point p2;//定义结构体变量p2
 
 struct Point p3 = {10,20};

 //代码二:初始化
 struct Stu//声明类型
 {
 	char name[15];//名字 
 	int age;//年龄 
  } ;
  
  struct Stu s1 = {"zhangsan",20};//初始化 
  struct Stu s2 = {.age=20,.name="lisi"};//指定顺序初始化 
  
  
  //代码三 
  struct Node
  {
  	int data;
  	struct Point p;
  	struct Node* next;
   } n1={10,{4,5},NULL};//结构体嵌套初始化 
   
   struct Node n2 = {20,{5,6},NULL};//结构体嵌套初始化 

4,结构成员访问操作符

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;
 } 

再来看两个示例

#include<stdio.h>
//形式1 
int main()
{
	struct Student s1 = {age=30,name="lisi",hight=180,wight=75.5f};//初始化
	printf("%s %d% d %.1f %s\n",s1.name,s1.age,s1.high,s1.wight,s1.id);
}

//形式2
/*struct S
{
	char c;
	int n;
 };
 
struct B
{
	struct S s;
	int *p;
	char arr[10];
	float sc;
};

int main()
{
	struct B b={{'w',99},NULL,"hehe",85.5f};
	printf("%c\n",b.s.c);
	return 0;
}*/

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

4.2结构体成员的间接访问

使用方法:结构体指针->成员名

#include<stdio.h>
struct Point
{
	int x;
	int y;
};

int main()
{
	struct Point p = {3,4};
	struct Point *ptr = &p;
	ptr->x = 10;
	ptr->y = 20;
	printf("x = %d y = %d\n",ptr->x,ptr->y);
	return 0;
}

4.3两种方式综合举例:

#include<stdio.h>
#include<string.h>

struct Stu
{
	char name[15];
	int age;
};

void print_stu(struct Stu s)
{
	printf("%s %d\n",s.name ,s.age );
}

void set_stu(struct Stu* ps)
{
	strcpy(ps->name ,"lisi");
	ps->age = 28;
}

int main()
{
	struct Stu s = {"zhangsan",20};
	print_stu(s);
	set_stu(&s);
	print_stu(s);
	return 0;
}

5,typedef关键字介绍 

在C语言中,typedef是一个关键字,主要用于为数据类型定义一个新的名称,这样可以使得代码更加简洁和易于阅读。

以下是一些使用`typedef`的示例和用途:

1,为基本数据类型定义新的类型名
`typedef`可以用于为基本数据类型定义新的类型名,例如:

typedef int myInt;
myInt value; // 相当于 int value;


在这个例子中,`myInt`被定义为一个新的类型名称,它与`int`具有相同的语义,这样做的好处是在代码的其他部分引用这个类型时,可以直接使用myInt,而不必写完整的类型名称int.

2,为自定义数据类型定义简洁的类型名称
也可以用于为自定义数据类型(如结构体、联合体和枚举类型)定义简洁的类型名称。

例如,假设我们有一个结构体:

struct Complex {
    double image;
    double real;
};


我们可以使用`typedef`为其定义一个简短的类型名称:

typedef struct Complex myComplex;
myComplex complexValue; // 相当于 struct Complex complexValue;


这样做可以使代码更加清晰,尤其是在处理复杂的类型声明时 [❷]

3. 为数组定义简洁的类型名称
`typedef`还可以用于为数组定义简洁的类型名称,

例如:
这使得声明和引用具有相同长度的数组变得更加容易 


typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr; // 相当于 int arr[100]

4, 为指针定义简洁的名称
`typedef`同样适用于为指针定义简洁的名称,例如:
 

typedef int* pInt;
pInt p; // 相当于 int* p;


这有助于简化指针声明和引用 [❷]

注意事项
在使用`typedef`时,需要注意以下几点:
-①`typedef`仅限于为类型定义符号名称,而`#define`不仅可以为类型定义别名,还能为常量定义别名
- ②在使用`typedef`定义结构体时,如果结构体中包含了指向该结构体的指针,需要特别注意语法问题。因为当结构体还未定义完成时,编译器可能无法识别其中的指针类型 

总的来说,`typedef`在C语言中提供了一种灵活的方式来定义和使用类型,从而提高了代码的可读性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值