目录

一、结构体

二、结构体的定义

1.最基本的定义

2.有 typedef 的定义

3.定义即对象方式

4.定义即对象指针方式(涉及指针就会稍微复杂一点)

5. typedef结构体和结构体指针方式

三、结构体的使用


一、结构体

结构体是用户自定义的一种类型,这种类型里面可以声明不同的数据类型,如char、int...等等,以此来满足用户对某种对象的数据描述。比如我想描述某个人的职业信息,那么通过描述他的姓名(char name[ ]),年龄(int),职业(char position[ ]),业绩(char),年薪( int )等就可以很清楚的知道这个的人的职业信息,当我需要把这个人的职业信息发给亲戚,总不能一句句发,而是全部整合到一起发,那么将多种数据类型整合到一起,我们可以使用结构体类型。

二、结构体的定义

结构体定义的方式有很多种:

1.最基本的定义

struct Person
{char name[16];int age;
};

此定义,定义了一个Person结构体(记住是Person结构体,而不是叫结构体Person),意味着 struct Person才是结构体类型,struct叫做关键字,Person叫做标识符。因此,我们在使用的时候就得这样使用:

struct Person john;

这个Person结构体声明了一个对象,叫做 john。那么我们的某些编译器为了让我们节省打字压力,允许我们省略 struct 关键字:

Person john;

ps:这里Person没有变色是因为我们的结构体定义没有写进去,就写了一个声明对象。不是因为这种声明方式不可以哈(我的编译器是支持这种写法的)。但是这种写法在理论上来说是错误的(世上本没有路,走的人多了也就变成了路),如定义所说,这Person只是描述符,只有struct Person这种才代表了结构体类型,所以这种声明方式可以但不推荐大家这样写,以免对结构体定义有所混淆,那么如何正确省略struct这个关键字,看下面第2种定义。

2.有 typedef 的定义

typedef struct Person
{char name[16];int age;
}per;

这里的定义,用口语正确表达是:首先定义了一个struct Person的结构体,然后 typedef 关键字(这个关键字叫别定义)将 struct Person 别定义为 per。也就是说现在 per 就等价于 struct Person。那么就有如下声明:

per john;

这样才是正确省略struct的方式。那么可以看出,用了 typedef 之后:

struct Person john;//正确,最原始的声明per john;//正确,typedef的声明
struct per john;//错误,per = struct Person

3.定义即对象方式

struct Person
{char name[];int age;
}per;

这种没有使用typedef的定义方式,叫定义即对象,也就是per就是struct Person的对象,相当于第2条中的 john。对于这种直接定义了对象的,可以重新使用如下声明第二个对象,也可以直接使用对象per:

struct Person john;//声明对象john

那么这里的per,也是对象,是可以直接使用的,无需再重复声明了,如下使用

struct Person
{char name[16];int age;
}per;int main()
{strcpy(per.name, "xiaoming");per.age = 16;printf("%s\n", per.name);printf("%d\n", per.age);return 0;
}

4.定义即对象指针方式(涉及指针就会稍微复杂一点)

struct Person
{char name[16];int age;
}*per;int main()
{per = (Person*)malloc(sizeof(struct Person));strcpy(per->name, "xiaoming");per->age = 16;printf("%s\n", per->name);printf("%d\n", per->age);free(per);return 0;
}

这种定义方式,和第3条有点类似,都是直接定义了Person结构体的对象,不过现在这个对象是个指针,所以per我们称为结构体指针。

如果在定义时就声明了结构体指针,这指针是全局变量,存储在静态区,在整个程序结束后才会释放 *per 的内存(当然,要明白这个内存是存储的是 指针 本身即指针的地址,而不是数据成员name和age,现在这个指针的地址用了变量per表示, 这个 指针的变量per 的内容(值)是另一块内存的地址,即数据成员的首地址)。

其次,在其他函数中(如main函数)欲使用 指针per 指向的数据成员,需要为数据成员开辟内存空间,使用malloc函数。这样 指针per(*per)指向的内存(数据成员的内存)就是存储在 堆 上,而非 栈(只存储局部变量) 上,也不是静态区(只存储静态变量和全局变量)。在使用完毕后,需要使用 free函数 手动释放存储在 堆 上的数据成员的内存空间。

5. typedef结构体和结构体指针方式

typedef struct Person
{char name[16];int age;
}per, *perptr;int main()
{per a;a.age = 16;printf("%d\n", a.age);perptr v;v = (Person *)malloc(sizeof(struct Person));v->age = 14;printf("%d\n", v->age);free(v);return 0;
}

看到这里,你就需要明白,既然用了typedef关键字,就代表 per 等价于 struct Person,*perptr 等价于 struct Person*(好好理解有typedef和没有typedef的区别,一个是结构体指针,一个是结构体对象指针)。既然是结构体指针,那么首先肯定要声明一个对象, perptr v;

三、结构体的使用

结构体的使用其实在第二个里面有略微介绍到:主要就两种结构体和结构体指针的使用

typedef struct Base
{int a;
}base;int main()
{//1.结构体base A;A.a = 11;printf("%d\n", A.a);//2.结构体指针base* B;B = (base*)malloc(sizeof(base));B->a = 12;printf("%d\n", B->a);free(B);//2.结构体赋值给结构体指针,即这个结构体指针指向另一个结构体 base* C;C = &A;printf("%d\n", C->a);return 0;
}

那么结构体到此最基本的知识就已经讲完了------。

【C语言】结构体类型的定义与使用相关推荐

  1. linux c 结构体参数,C语言结构体类型定义

    C语言结构体类型定义 结构体的定义形式如下: struct 结构体名 { 结构体成员 }: 结构体变量的定义方式有三种: 1.先定义结构体,再定义变量: eg. struct student{ cha ...

  2. 结构体变量和结构体类型的定义

    结构体类型定义 定义方式1:Typedef struct LNode {int data; // 数据域struct LNode *next; // 指针域 } *LinkList; 定义方式2:st ...

  3. 阵列c语言,C语言结构体阵列的定义

    C语言结构体阵列的定义以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言结构体阵列的定义 1.C语言结构体阵列的定义 ...

  4. C语言结构体变量在定义时初始化

    C语言结构体变量在定义时就将其初始化的格式如下 struct struct_name struct_variable = {     .member1            = xxx,     .m ...

  5. 结构体类型的定义及所占内存的字节数

    C 语言允许用户自定义数据类型,典型的代表就是结构体,结构体类型和数组一样,都属于构造数据类型.它们之间的不同点就在于,数组是将相同类型的数据单独放在一起来存储,而结构体允许逻辑上相关,但类型不同的数 ...

  6. c语言中结构体变量的作用,C语言 结构体 类型变量的 定义 和 引用

    前面学习了变量和数组这些简单的数据结构,它们的特点是必须使用规定的数据类型.例如数组被定义为整型后,它的所有存储单元都是由整型构成.现实生活中某一类事物的共同属性可能是由不同的数据类型组成的集合,或者 ...

  7. Go 分布式学习利器(9)-- Go语言 结构体的行为定义和实现

    文章目录 1. Go语言的结构体 -- 数据成员的封装 2. Go (函数成员)行为的定义和实现 1. Go语言的结构体 – 数据成员的封装 Go语言官方给的描述是 既是面向对象语言,也不算面向对象语 ...

  8. C语言结构体指针的定义和初始化

    第一种方法:定义结构体,传入函数时取地址. typedef struct {int top; int bottom; int left; int right; }RECT_S;RECT_S pstRu ...

  9. 【C语言结构体题】定义用于存储学生信息的结构体数组,输入学生的准考证号、姓名和成绩信息,计算总分,并按总分由高到低输出。

    在此基础上,增加下列功能函数 1.学生信息查询功能,根据学生的准考证号查询学生成绩信息 2.学生信息插入功能,在结构体数组的指定位置插入学生信息 3.学生信息删除功能,根据准考证号来删除满足条件的学生 ...

最新文章

  1. 打印正方形和各种三角形
  2. Java网络编程笔记6
  3. Android--开发资源管理器/优化ListView显示列表方法
  4. flink shell的local模式(benv与senv的使用+处理报错的解决方案)
  5. 数字图像处理(五) 图像复原
  6. System76 是如何打造开源硬件的
  7. cad计算机试题及答案,CAD与CAM试题及答案.doc
  8. 自媒体行业现在还能赚钱吗?
  9. Error: (list) object cannot be coerced to type 'double'
  10. FBReader集成后,打开书出现空白页面
  11. 微信公众号的搭建-第二天-申请公众号并与本地测试服务器绑定
  12. 三、Android网络开发
  13. 《TCP/IP网络编程》第20章
  14. ecshop小京东产品后台版权及logo修改
  15. xp系统打印机服务器设置,WinXP打印机纸张规格设置的方法
  16. 传奇人物《周兴和》书连载23 劳燕分飞离故里
  17. 【PG】PG基础操作
  18. Entity Framework 6三层架构入门:创建数据访问层DAL
  19. 美的美少年暑期实习面经
  20. 概念肆虐:凭什么让“IPv9”横行无忌?

热门文章

  1. codeforces 632F. Magic Matrix (最小生成树)
  2. AD原理图两线相交但不为节点画法
  3. 微信公众号中接入图灵机器人
  4. android EditText 屏蔽长按弹出剪切 复制 全选菜单 的解决办法
  5. 广西教师招聘需要计算机考试证,报考2020广西教师招聘需要什么条件
  6. win7 旗舰版 纯净系统,小于4G的纯净系统
  7. linux驱动程序ioctl函数用法
  8. 第四方支付平台是聚合支付平台吗
  9. linux中.d是什么文件
  10. 多线程的四种实现方式