结构体(结构体嵌套结构体指针结构体参数传递)(代码片段)

lanhaicode lanhaicode     2023-02-28     639

关键词:

结构体(struct)

1、基本概念

结构体-----将不同类型的数据成员组织到统一的名字之下,适用于对关系紧密,逻辑相关、具有相同或不同类型的数据进行处理

2、结构体定义格式

struct 结构名(也可称作结构标识符)      

     

      类型 变量名;

       类型 变量名;

       ······

      ;

struct 结构名 结构变量;

或者

struct 结构名

      

       类型 变量名;

       类型 变量名;

       ······

       结构变量;

例:声明结构体类型的同时定义变量名

1 struct student
2 
3   int num;
4 teacher;

 

 定义了一个结构名为student的结构体和一个结构变量teacher,如果省略变量名(teacher),就变成了对结构的声明,上述结构体声明也可分开写

1 struct student
2 
3   int num;
4 ;
5 
6 struct student teacher;

 

与上面效果相同,可理解为struct student类似于int,而我们用的是teacher类似于变量,如果省略结构名,则称之为无名结构,这种情况常常出现在函数内部

1 struct
2 
3   int num;
4 teacher;

 

(在声明结构体时常常与typedef函数配合使用)

3、结构体成员的访问

访问结构体变量的成员必须使用成员选择运算符(也称圆点运算符),格式为:结构体变量名.成员名

若使用指针对结构体成员进行访问,格式为:指针->成员名 等价于 (*指针).成员名 

4、typedef函数

为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等),

(注意与#define的区别,typedef 是用来定义一种类型的新别名的,它不同于宏#define,不是简单的字符串替换)

例:

1 typedef int INTEGER;

 

 为int定义了一个新的名字INTEGER,也就是说INTEGER与int是同义词,也可以为结构体定义一个别名

1 typedef struct student STUDENT;

或者

1 Typedef struct student
2 
3   int num;
4 STUDENT;

上述两条语句是等价的,二者都是为struct student结构体类型定义了一个新的名字STUDENT,即STUDENT与struct student是同义词,所以下列两条语句等价

1 1 STUDENT stu1,stu2;
2 2 struct student stu1, stu2;

补充:

1 typedef struct tagNode
2 
3     char *pItem;
4     pNode pNext;
5  *pNode;

 

上述代码编译阶段会报错,原因:

在上面的代码中,新结构建立的过程中遇到了 pNext 声明,其类型是 pNode。这里要特别注意的是,pNode 表示的是该结构体的新别名。

于是问题出现了,在结构体类型本身还没有建立完成的时候,编译器根本就不认识 pNode,因为这个结构体类型的新别名还不存在,所以自然就会报错。

因此,我们要做一些适当的调整,比如将结构体中的 pNext 声明修改成如下方式:

1 typedef struct tagNode
2 
3     char *pItem;
4     struct tagNode *pNext;
5  *pNode;

 

或者将 struct 与 typedef 分开定义

1 typedef struct tagNode *pNode;
2 struct tagNode
3 
4     char *pItem;
5     pNode pNext;
6 ;

 

在上面的代码中,我们同样使用 typedef 给一个还未完全声明的类型 tagNode 起了一个新别名。不过,虽然 C 语言编译器完全支持这种做法,但不推荐这样做,建议改为

1 struct tagNode
2 
3     char *pItem;
4     struct tagNode *pNext;
5 ;
6 typedef struct tagNode *pNode;

 

5、typedef函数与#define函数

#define函数格式: 

#define 标识符 字符串,标识符成为宏名,宏替换时不做任何语法检查

1 typedef char* pStr1;
2 #define pStr2 char* 
3 pStr1 s1,s2;
4 pStr2 s3,s4;

 在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

上例中#define语句应该写成 pStr2 s3, *s4; 

6、结构体嵌套

 就是在一个结构体内包含了另一个结构体作为其成员

 1 typedef struct date
 2     
 3     int year;
 4     int month;
 5     int day;
 6 DATE;
 7 
 8 typedef struct student
 9 
10     long studentID;
11     char studentName[10];
12     char studentSex;
13     DATE birthday;
14     int score[4];
15 STUDENT;

 

当出现结构体嵌套时,必须以级联方式访问结构体成员,即通过成员选择运算符逐级找到最底层的成员时再引用

1 STUDENT pp;
2 pp.birthday.day = 10;
3 printf("%d", pp.birthday.day);

 

 

C语言允许对具有相同结构体类型的变量进行整体赋值,注意:对字符数组型结构体成员进行赋值时一定要使用strcpy()

1 strcpy(stu1.studentName, “王刚”);

 而不能写成

1 stu2.studentName = stu1.studentName

因为结构体成员studentName是一个字符型数组,studentName是该数组的名字,代表字符型数组的首地址,是一个常量,不能作为赋值表达式的左值,

结构体所占内存的字节数,不是简单的相加, 因为对多数计算机而言,为了提高内存寻址的效率,很多处理器体系结构为特定的数据类型引入了特殊了内存对齐需求,

不同的系统和编译器,内存对齐的方式有所不同,为了满足处理器的对其要求,可能会在较小的成员后加入补位,例:

1 Typedef struct sample
2 
3     Char m1;
4     Int m2;
5     Char m3;
6 SAMPLE;

 字节长度为12而不是1+4+1=6字节长度,即sizeof(struct sample)==12;

7、结构体指针的定义和初始化

 1 typedef struct student
 2 
 3     long studentID;
 4     char studentName[10];
 5     char studentSex;
 6     DATE birthday;
 7     int score[4];
 8 STUDENT;
 9 STUDENT stu1;
10 STUDENT *pt;
11 pt = &stu1;

或者

1 STUDENT *pt = &stu1;

 指向结构体数组的指针,假设已声明了STUDENT结构体类型,并且已定义了一个有30个元素的结构体数组stu,则定义结构体指针变量pt并将其指向结构体数组stu的方法为:

1 STUDENT *pt = stu;

 

等价于

1 STUDENT *pt = &stu[0];

 

等价于

1 STUDENT *pt;
2 pt = stu;

 

8、向函数传递结构体(参数传递)

将结构体传递给函数的方式有如下3种:

  1.用结构体的单个成员作为函数参数,向函数传递结构体的单个成员(属于传值调用不会影响相应的实参结构体的值

  2.用结构体变量做函数参数,向函数传递结构体完整结构(属于传值调用不会影响相应的实参结构体的值

  3.用结构体指针或结构体数组作函数参数属于模拟按引用调用向函数传递结构体地址,因为仅复制结构体首地址一个值给被调函数,相对于第二种方式,这种传递效率更高

 参考链接:

https://www.cnblogs.com/ktao/p/8578074.html

https://www.cnblogs.com/qyaizs/articles/2039101.html

http://c.biancheng.net/view/298.html

 


c++基础3(函数指针结构体)(代码片段)

...针const修饰指针指针和数组指针和函数指针、数组、函数结构体结构体基本概念结构体定义和使用结构体数组结构体指针结构体嵌套结构体结构体做函数参数结构体中const使用场景结构体案例案例1案例2函数函数的定义函数的定义... 查看详情

c语言关于结构体做参数传递?

...变了。学生一枚,求大神解释一下参考技术A双指针C语言结构体传参小-黯原创关注7点赞·2315人阅读目录C语言结构体传参1.普通传参1.1测试代码1.2测试结果1.3结果分析2.单指针传参2.1修改结构体数据2.1.1测试代码2.1.2测试结果... 查看详情

c语言-结构体(代码片段)

结构体结构体类型数据的定义和引用方法一.结构体类型的概念定义结构体变量定义结构体类型变量的方法引用结构体成员成员引用引用结构体数据成员的方法整体引用初始化结构体变量结构体嵌套和用指针引用结构体成员指向... 查看详情

结构体作为函数参数值传递的问题

参考技术A传结构体地址与传结构体指针二者都可以作为传出参数,因为接受函数必须为其定义一个结构指针来接收,这样在函数内就可以修改结构体,在这点上二者没有区别。定义结构体指针未分配地址空间就作为参数传递会... 查看详情

c语言结构体(结构体作为函数参数|结构体指针作为函数参数)(代码片段)

文章目录一、结构体作为函数参数二、结构体指针作为函数参数三、完整代码示例一、结构体作为函数参数结构体变量作为函数形参,在函数中,只能访问该函数形参,无法修改结构体内存的值;结构体变量通过形参形式传入,会在该p... 查看详情

c基础结构体(代码片段)

目录一、结构体struct的定义和.操作符的使用二、结构体的创建和初始化三、结构体的内存对齐模式3.1结构体强转其他类型四、指定结构体元素的位字段(bit)五、结构数组5.1结构体数组的冒泡排序六、结构体嵌套七、结构体的赋值... 查看详情

(60)结构体指针结构体变量嵌套结构体指针嵌套函数指针数组指针指针数组typedef综合运用

...clude<iostream>#include<malloc.h>/*author:吴永聪program:结构体指针、结构体变量嵌套、结构体指针嵌套、函数指针、数组指针、指针数组、typedef综合运用date:2017.6.3sumup:结构体嵌套指针(函数指针、结构体指针、数组指针等)... 查看详情

golang结构体嵌套和用结构体实现模拟“继承”(代码片段)

什么是结构体嵌套一个结构体中可以嵌套包含另一个结构体或结构体指针结构体嵌套packagemainimport"fmt"//桌子结构体typetablestruct materialstring shapeint comcommon//嵌套结构体//被嵌套的结构体定义typecommonstruct yearintfuncmain() //嵌套结... 查看详情

go结构体嵌套和用结构体实现模拟“继承”(代码片段)

什么是结构体嵌套一个结构体中可以嵌套包含另一个结构体或结构体指针结构体嵌套packagemainimport"fmt"//桌子结构体typetablestruct materialstring shapeint comcommon//嵌套结构体//被嵌套的结构体定义typecommonstruct yearintfuncmain() //嵌套结... 查看详情

20170908_郝斌c结构体

为什么要结构体结构体知识点1结构体的赋值和初始化StructStudent{intage;chargender;floatscore;};2   取出结构体中的每一个成员结构体.成员结构体指针变量名->成员3 结构体变量和结构体指针变量作为函数参数传递时的问... 查看详情

go语言基础:结构体(代码片段)

文章目录结构体类型别名和自定义类型自定义类型类型别名类型定义和类型别名的区别结构体结构体的定义结构体实例化基本实例化匿名结构体创建指针类型结构体取结构体的地址实例化结构体初始化使用键值对初始化结构体内... 查看详情

go语言基础:结构体(代码片段)

文章目录结构体类型别名和自定义类型自定义类型类型别名类型定义和类型别名的区别结构体结构体的定义结构体实例化基本实例化匿名结构体创建指针类型结构体取结构体的地址实例化结构体初始化使用键值对初始化结构体内... 查看详情

c语言结构体(结构体中嵌套二级指针|为结构体内的二级指针成员分配内存|释放结构体内的二级指针成员内存)(代码片段)

文章目录一、结构体中嵌套二级指针1、结构体中嵌套二级指针类型声明2、为结构体内的二级指针成员分配内存3、释放结构体内的二级指针成员内存二、完整代码示例一、结构体中嵌套二级指针1、结构体中嵌套二级指针类型声... 查看详情

c语言结构体(结构体中嵌套一级指针|分配内存时先为结构体分配内存然后再为指针分配内存|释放内存时先释放指针成员内存然后再释放结构头内存)(代码片段)

文章目录一、结构体中嵌套一级指针1、声明结构体类型2、为结构体变量分配内存(分配内存时先为结构体分配内存然后再为指针分配内存)3、释放结构体内存(释放内存时先释放指针成员内存然后再释放结构头内存)二、完整代码... 查看详情

go语言学习之旅--结构体(代码片段)

结构体go语言类型定义go语言类型别名go语言类型定义和类型别名的区别结构体go语言结构体的定义声明一个结构体变量结构体的初始化访问结构体成员匿名结构体结构体指针举例使用new关键字创建结构体指针访问结构体指针成员... 查看详情

go语言学习之旅--结构体(代码片段)

结构体go语言类型定义go语言类型别名go语言类型定义和类型别名的区别结构体go语言结构体的定义声明一个结构体变量结构体的初始化访问结构体成员匿名结构体结构体指针举例使用new关键字创建结构体指针访问结构体指针成员... 查看详情

go-常识补充-切片-map(类似字典)-字符串-指针-结构体(代码片段)

...指针向函数传递指针参数传递数组指针(最好是用切片)结构体结构体零值匿名结构体结构体指针结构体匿名字段结构体嵌套结构体嵌套+匿名字段结构体相等比较作业Go常识补充Go命名名字首字母大写可以在外部引用,如果是小... 查看详情

调用一个动态库中的函数,这个函数有一个参数是结构体指针,我如何使用这个指针?

我是希望利用动态库中的结构体指针,它就好比是一个返回值。在我自己的函数里定义了一个结构体指针,将其传递给这个动态库中的函数,将动态库函数中的结构体指针赋给我定义的结构体指针,但其值并不是动态库函数中结... 查看详情