当前位置: 首页 > article >正文

C语言之指针与结构体

【我们为什么要使用结构体?】
假如我们要设计一个员工管理系统,一共有100名员工,我们需要记录每一个员工的姓名,性别,职位,地址,电话号码等相关信息,如果我们逐一去申请变量,那么我们需要用到600个变量,显然不好操作;那我们如果定义数组,显然也是不可采取的,因为定义每一个员工中需要用到数据的类型都各不相同。那我们怎么办呢?

为了方便处理数据,结构体就是把一些相关的,类型不同的子项数据结合在一起,结构体实际上是一种自定义的数据类型,可以包含若干个数据类型相同或者不同的数据项。
简单的来说,结构体可以将多个单一的数据结合在一起,方便处理数据

【定义结构体】

struct  结构体名 { 数据类型  结构体成员;} 结构体变量名(可选);

来个例子吧!

struct person_info{//描述人的信息,struct一定不能丢
char name[];
int age;
char add[];
...
}Rual,Kobe;//可以定义结构体变量,也可以不定义

结构体的成员可以是人员类型,也可以包括其他结构体

struct person_infor
{
char name[];
int age;
char job[];
char add[];
long int phone;
struct date time;//结构体的成员可以是其他结构体,但是必须提前定义好
};

我们可以根据结构体来定义结构体变量:

struct person_info{
char name[];
int age;
char add[];
...
};
struct employee_infor Kobe;//定义变量Kobe
struct employee_infor Gasol;//定义变量Gasol

注意:
1.我们在定义结构体与结构体变量时,struct一定不能丢,函数体必须在函数体外定义,也可以把结构体定义在头文件中,然后在程序中用#include包含。
2.定义结构体必须在函数体外,使用结构体的时候必须在函数体外。

来个例子吧!估计大家又听不懂了

#include <stdio.h>
struct pe_info//定义结构体
{
char name[100];//切记不要初始化变量
int age;
char add[100];
};//注意;表示定义结束int main(void)
{
//pe_info Kobe;这样定义变量是错误的
//pe_info Gasol;这样定义变量是错误的struct pe_info Kobe={"Kobe",37,"Lakers"};//赋值struct pe_info Gasol={"Gasol",35,"bull"};
//加上struct是为了区分普通变量//访问Kobe的姓名printf("struct pe_for Kobe lst mem %s\n",Kobe.name);printf("struct pe_for Gasol lst mem %s\n",Gasol.name);return 0;
}

运行结果:
在这里插入图片描述
如何访问结构体的成员?
形式:结构体变量名.成员

我们在初始化结构体变量的时候,也可以用typedef,去简化结构体变量名。
我们来看一段代码:
我们用pinf来简化struct pe_info;与上面代码的效果是一样的。

#include <stdio.h>
typedef struct pe_info//定义结构体
{
char name[100];//切记不要初始化变量
int age;
char add[100];
}pinf;//注意;表示定义结束int main(void)
{
//pe_info Kobe;这样定义变量是错误的
//pe_info Gasol;这样定义变量是错误的pinf Kobe={"Kobe",37,"Lakers"};//赋值pinf Gasol={"Gasol",35,"bull"};
//加上struct是为了区分普通变量//访问Kobe的姓名printf("struct pe_for Kobe lst mem %s\n",Kobe.name);printf("struct pe_for Gasol lst mem %s\n",Gasol.name);return 0;
}

运行结果:
在这里插入图片描述
我们再来个例子:给结构体赋值并输出结构体

#include <stdio.h>
typedef struct pe_info//定义结构体
{
char name[100];//切记不要初始化变量
int age;
char add[100];
}pinf;//注意;表示定义结束int main(void)
{
//pe_info Kobe;这样定义变量是错误的
//pe_info Gasol;这样定义变量是错误的pinf Kobe={"Kobe",37,"Lakers"};//赋值pinf Gasol={"Gasol",35,"bull"};
//加上struct是为了区分普通变量//访问Kobe的姓名printf("struct pe_for Kobe lst mem %s\n",Kobe.name);printf("struct pe_for Kobe 2st mem %d\n",Kobe.age);//注意年龄是int整型printf("struct pe_for Kobe 3st mem %s\n",Kobe.add);printf("\n");printf("struct pe_for Gasol lst mem %s\n",Gasol.name);printf("struct pe_for Gasol 2st mem %d\n",Gasol.age);printf("struct pe_for Gasol 3st mem %s\n",Gasol.name);return 0;
}

运行结果:
在这里插入图片描述
那么结构体在内存中是怎么处理的呢?
我们看下面的结构体:

struct date_typ{
int a;
char b;
double c;
}tt;

int a————4个字节
char b———1个字节
double c——16个字节

所以结构体总长度为4+1+16=21字节;

【结构体数组】
结构体数组和基本数组定义方法相同

先定义结构体,再声明结构体数组

typedef struct pe_infor{
char name[SIZE];
int age;
char team[SIZE];
}pe_info;pe_info pers[30];//声明一个数组,包含30个元素

我们用结构体数组来写个程序:输入5个同学的学号,姓名和成绩:

#include <stdio.h>
typedef struct stu_info//定义结构体
{int id;char name[100];int score;
}s_inf;int main(void)
{s_inf stu[5];//定义一个长度为5的结构体数组for(int i=0;i<5;i++)//循环输入学生信息{printf("input %d stu_name:",i+1);//姓名scanf("%s",&stu[i].name);printf("input %d stu_id:",i+1);//学号scanf("%d",&stu[i].id);printf("input %d stu_score:",i+1);//分数scanf("%d",&stu[i].score);printf("\n");}return 0;
}

运行结果:
在这里插入图片描述
【指向结构体的指针】

typedef struct pe_infor{
char name[SIZE];
int age;
char team[SIZE];
}pe_info;pe_info *p;//赋值
p=&pe_info;

结构体指针一般用->符号来引用变量

pe_info *p=NULL;//定义结构体类型的指针,分别引用结构体成员
p->name;等价于(*p).name;
p->age;等价于(*p).age;
p->team;等价于(*p).team;
//指向结构体的指针p->结构体成员
http://www.lryc.cn/news/2413839.html

相关文章:

  • 古代奥运会创始人是谁?
  • Android-保姆级初步工作
  • 如何防御DDOS攻击 DDOS攻击是什么意思
  • 常用黑盒测试方法
  • 使用canvas进行图像处理
  • JSBSim学习笔记(1)——简介
  • WakeLock保持后台唤醒状态
  • js disabled属性的添加与删除
  • USACO1.4 母亲的牛奶 Mother's Milk
  • Reflect中MethodInfo使用方法
  • MyEclipse 8.0 M1 下载 (Standard and Pro Editions)
  • 本地连接的ip地址 子网掩码 默认网关 还有dns服务器地址怎么设置? (转自网易博客)
  • OA项目之我的审批(查询会议签字)
  • nodejs 使用async进行BT吧最新电影数据爬取
  • FLASH常见问题
  • C/C++《计算思维综合实践I》参考选题(84题)[2024-05-22]
  • 个人面试总结暨2020年终总结
  • 聊一聊go的单元测试(goconvey、gomonkey、gomock、ginkgo)
  • 乐Pad A1拆机全程
  • 小周恋爱日记网站
  • 恐龙机器人钢索恐龙形态_机器恐龙铁渣2.0:P1S的钢索终于有伴了
  • 如何查找和注册已备案过期域名
  • 【纯转】Div+CSS经典速成教程。
  • 一文实现nnUNet v2 分割肾脏肿瘤数据集KiTS19
  • win篇--winserver2008R2系统自动更新报错:代码:80092004
  • 火狐与IE兼容性总结(待整理,代码有点乱)
  • MDK常用快捷键和操作
  • 企业竞争竞争情报系统的流程整合
  • 天天酷跑刷钻石辅助下载 最新无异常攻略
  • vs2005 创建动态库及其调用方法