-
struct,typedef struct结构体
2018-05-05 18:38:39一.struct 结构体框架 : struct 类型名{ };例:struct Student{char name[20];int age;};结构体自定义数据类型,定义完成后等同于内置类型。1.结构体不能定义一个自身的普通成员,但可以定义一个指向自身的指针...一.struct 结构体框架 :
struct 类型名
{
};
例:struct Student
{
char name[20];
int age;
};
结构体自定义数据类型,定义完成后等同于内置类型。
1.结构体不能定义一个自身的普通成员,但可以定义一个指向自身的指针。
例:
struct Student
{
char name[20];
int age;
};
struct A
{
struct Student e; //ok
struct B f; //error B未定义
struct A g; //error,因为无法确定g的大小,不能给它分配内存空间
struct A *p; //ok
};
2.结构体普通变量通过"."号访问它的成员,而结构体指针通过"->"号访问它的成员。
struct Student
{
char name[20];
int age;
};
struct Student stu1;//stu1的name和age为随机值
struct Student stu2={"zhang"};//name=zhang,age=0 因为stu2为聚合类型
struct Student stu3={"li",25};
若要将stu3的age变为30 进行操作 stu3.age=30;
若要将stu3的name变为"wang" 进行操作strcpy(stu3.name,"wang");
struct Student *pstu=&stu2;
若要将stu2的age变为35 进行操作pstu->age=35//也可以(*pstu).age=35;一般用"->"
若要将stu2的name变为"sun" 进行操作strcpy(pstu->name,"sun");//也可以strcpy((*pstu).name,"sun");一般用"->"
例:
#include <stdio.h> #include<string.h> struct Student { char name[20]; int age; }; void show(struct Student *s) { printf("name:%s\nage:%d\n\n",s->name,s->age); } int main() { struct Student stu1;//stu1的name和age为随机值 struct Student stu2={"zhang"};//name=zhang,age=0 因为stu2为聚合类型 struct Student stu3={"li",25}; printf("stu1:\n"); show(&stu1); printf("stu2:\n"); show(&stu2); printf("stu3:\n"); show(&stu3); //若要将stu3的age变为30 进行操作 stu3.age=30; //若要将stu3的name变为"wang" 进行操作strcpy(stu3.name,"wang"); stu3.age=30; strcpy(stu3.name,"wang"); printf("修改后的stu3:\n"); show(&stu3); struct Student *pstu=&stu2; //若要将stu2的age变为35 // 进行操作pstu->age=35也可以(*pstu).age=35; //若要将stu2的name变为"sun" //进行操作strcpy(stu2->name,"sun");也可以strcpy((*pstu).name,"sun"); pstu->age=35; strcpy(pstu->name,"sun"); printf("修改后的stu2:\n"); show(&stu2); return 0; }
结果:
二.typedef
typedef 数据类型 新数据类型 //它用于类型定义,就相当于给一个类型起一个新名称
typedef unsigned long long int unit64; //给unsigned long long int 起新名称为unit64
unit64 a; //变量a的类型unsigned long long int
区分:
typedef int * Pint;
#define PINT int *
Pint i,j; //i,j的类型都为int *
PINT x,y; //x的类型为int * ,y的类型为int
typedef int Arr[10];
Arr a; //定义一个长度为10的int 数组,数组名为a
例:
typedef int Arr[10]; int main() { Arr a; printf("%d\n",sizeof(a)); return 0; }
结果:
typedef int (*pfun)(int ,int);
pfun p; //变量p为一个返回值int,函数形参为两个int的函数指针
例:
int Max(int a,int b) { return a>b?a:b; } typedef int (*pfun)(int,int); int main() { pfun p=Max; printf("%d\n",p(2,6)); return 0; }
结果:
用typedef 简略结构体名称
例:struct Student
{
char name[20];
int age;
};
定义结构体变量时要加上struct 比较麻烦
struct Student e;为了简略用typedef 给struct Student起新名称为Student
typedef struct Student Student;
此时定义结构体变量时为 Student e;
例:
struct Student { char name[20]; int age; }; typedef struct Student Student; int main() { Student e={"wang",23}; printf("name:%s\nage:%d\n",e.name,e.age); return 0; }
结果:
在C++中通常使用
typedef struct Student
{
char name[20];
int age;
}Student; //Student为给struct Student起的新名称
例:
typedef struct Student { char name[20]; int age; }Student; int main() { Student e={"wang",23}; printf("name:%s\nage:%d\n",e.name,e.age); return 0; }
结果:
-
struct和typedef struct 结构体定义区别
2019-05-03 10:59:341.结构体的定义: 允许用户自己建立由不同类型数据组成的组合型的数据结构...2.下面以一个结构体实例来说明一下struct的用法: structos_tcb { OS_STK*OSTCBStkPtr; OS_STK*OSTCBStkBottom; INT32UOSTCBStkSi...1.结构体的定义:
允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(实际上应称为 结构体类型)。
2.下面以一个结构体实例来说明一下struct的用法:
struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
};
Sturct 是声明结构体类型时所必须使用的关键字,不能省略。
os_tcb 是结构体名
花括号内 是该结构体所包括的子项,称为结构体成员。
前面只是建立了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。
可以采取以下3中方式定义结构体类型变量。
(1)先声明结构体类型,再定义该类型的变量
定义上面的结构体类型后
struct os_tcb OS_TCB; // 在定义了结构体变量后,系统会为之
| | // 分配内存单元
结构体类型名 结构体变量名
(2)在声明类型的同时定义变量
struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
} OS_TCB; // OS_TCB 是一个结构体变量
(3)不指定类型名而直接定义结构体类型变量
struct
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
} OS_TCB; // OS_TCB 是一个结构体变量
指定了一个无结构体名的结构体类型,显然不能再以此结构体类型去定义其他变量。
注:结构体类型与结构体变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取后运算。在编译时,对类型不分配空间,只对变量分配空间。
3.下面再以此结构体实例来说明一下typedef struct的用法:
(主要参考技术博客:http://dzdesigned80.blog.163.com/blog/static/203259238201245105525341/)
阅读程序发现两种用 typedef struct 定义结构体的方法
第一种:
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB;
第二种:
typedef struct
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB;
可以看出,上面的区别在于 typedef struct 后面一个跟了标识符,另外一个没有跟标识符,这两个有什么区别呢?这里的os_tcb代表什么?OS_TCB的意义又是什么?
要搞清楚上面的问题,要从两方面入手。
第一 typedef的用法是什么?
typedef是在基本类型的基础上定义类型的同义字。注意typedef并不产生新的类型。例如 typedef int exam_score;这里的exam_score 就是一种基本类型,它的意义等同于 int,那么机可以用它来定义变量,exam_score LIMING。
第二 结构体的定义各个标志符的意义。
在结构体定义中,通常是这样的
struct exam_score
{
chinese;
english;
math;
physical;
chemistry;
}LIMING;
这里的struct是结构体关键字,exam_score则是结构体类型名,LIMING则是结构体变量。
弄明白以上两个问题,回过头来看开始的那两个结构体。
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB; // OS_TCB是一个结构体类型 = struct os_tcb
这里声明一种结构体类型os_tcb,所以os_tcb就是结构体类型名;OS_TCB是struct os_tcb 的同义字,所以可以直接用OS_TCB来定义变量,同时也可以这样 struct os_tcb xxx,OS_TCB xxx;都是合法的,因为OS_TCB就等同于
struct os_tcb。
来看第二种
typedef struct
{
OS_STK *OSTCBStkPtr;
OS_STK *OSTCBStkBottom;
INT32U OSTCBStkSize;
INT16U OSTCBOpt;
INT16U OSTCBId;
}OS_TCB; // OS_TCB是一个结构体类型 = struct
在结构体的定义中允许这样形式的定义:
struct
{
xxx
xxx
xxx
}var;
这里没有声明结构体变量名,直接定义了结构体变量var,var在这里是结构体变量。这样定义的结果是在程序不能再定义新的结构体变量。
这种形式加上typedef 之后情况就变了,这里的OS_TCB不是结构体变量,而是struct的同义字(结构体类型),这个同义仅限于上面定义的那种情况,可以用OS_TCB来定义结构体变量。
总结:
有了以上叙述与理解,我们便可以很容易搞清楚一个易混淆的点:struct{}后面的到底是结构体变量名,还是结构体类型名。
当只是定义结构体类型:
struct 结构体名
{
结构体成员名
}结构体变量名;
引用结构体成员方式应是:
结构体变量名. 结构体成员名 //结构体变量直接引用结构体成员
当使用typedef定义时:
typedef struct 结构体名
{
结构体成员名
}结构体类型名;
引用结构体成员方式应是:
结构体类型名 xxx;// 定义一个结构体变量
xxx.结构体成员名 // 引用结构体成员
---------------------
作者:SudekiMing
来源:CSDN
原文:https://blog.csdn.net/WalterBrien/article/details/79624405
版权声明:本文为博主原创文章,转载请附上博文链接! -
c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数...
2020-08-02 14:41:35十二、结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。...struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: struct 结构体名 .十二、结构体
(1)结构体定义和使用
基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
参考视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=4205594350351753444
已投币三连,非常好的视频教程,感谢up主的奉献。
结构体定义和使用:
语法:
struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种:
struct 结构体名 变量名; struct 结构体名 变量名 = { 成员1值, 成员2值... }; 定义结构体时顺便创建变量;
代码:
/* ------------------ 1.struct 结构体名 变量名; 之后进行赋值操作 ------------------ */ struct Student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; int main() { //struct Student xiaoMing; Student xiaoMing; // struct关键字可以省略 xiaoMing.name = "小明"; xiaoMing.age = 18; xiaoMing.score = 96; xiaoMing = { "小明", 18, 96 }; cout << "姓名:" << xiaoMing.name << " 年龄:" << xiaoMing.age << " 分数:" << xiaoMing.score << endl; system("pause"); return 0; } /* -------------- 2.struct 结构体名 变量名 = { 成员1值, 成员2值... }; -------------- */ struct Student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; int main() { Student xiaoMing = {"小明", 18, 96}; cout << "姓名:" << xiaoMing.name << " 年龄:" << xiaoMing.age << " 分数:" << xiaoMing.score << endl; system("pause"); return 0; } /* -------------------- 3.定义结构体时顺便创建变量; -------------------- */ struct Student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; int main() { xiaoMing.name = "小明"; xiaoMing.age = 18; xiaoMing.score = 96; xiaoMing = { "小明", 18, 96 }; cout << "姓名:" << xiaoMing.name << " 年龄:" << xiaoMing.age << " 分数:" << xiaoMing.score << endl; system("pause"); return 0; } ----------------------------------------------------------------------------------- 姓名:小明 年龄:18 分数:96 请按任意键继续. . .
使用 typedef 定义 struct 结构体方法:https://blog.csdn.net/Mark_md/article/details/107656790
(2)结构体数组
作用:将自定义的结构体放入到数组中,方便维护。
语法:
struct 结构体名 数组名[ 元素个数 ] = { {}, {}, ... {} };
struct Student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; int main() { struct Student stuArray[3] = { { "小明", 18, 96 }, { "小红", 20, 100 }, { "小亮", 21, 98 } }; for (int i = 0; i < 3; i++) { cout << "姓名:" << stuArray[i].name << " 年龄:" << stuArray[i].age << " 分数:" << stuArray[i].score << endl; } system("pause"); return 0; } ---------------------------------------------------------------------------- 姓名:小明 年龄:18 分数:96 姓名:小红 年龄:20 分数:100 姓名:小亮 年龄:21 分数:98 请按任意键继续. . .
(3)结构体指针
作用:通过指针访问结构体中的成员。
利用操作符 -> 可以通过结构体指针访问结构体属性。
示例:
struct Student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; int main() { struct Student xiaoMing = { "小明", 18, 96 }; Student* p = &xiaoMing; cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl; system("pause"); return 0; } ----------------------------------------------------------------- 姓名:小明 年龄:18 分数:96 请按任意键继续. . .
(4)结构体嵌套
结构体嵌套结构体:
作用:结构体中的成员可以是另一个结构体。
例如:每个老师辅导一个学员,老师的结构体中,记录学生的结构体。
示例:
struct student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; struct teacher { int id; // 职工编号 string name; // 教师姓名 int age; // 教师年龄 struct student stu; // 子结构体 学生 }; int main() { teacher wang; wang.id = 112374; wang.name = "王芳"; wang.age = 26; wang.stu.name = "小明"; wang.stu.age = 18; wang.stu.score = 96; cout << "教师姓名:" << wang.name << " 教师年龄:" << wang.age << " 教师ID号:" << wang.id << endl; cout << "学生姓名:" << wang.stu.name << " 学生年龄:" << wang.stu.age << " 学生分数:" << wang.stu.score << endl; system("pause"); return 0; } ------------------------------------------------------------------------- 教师姓名:王芳 教师年龄:26 教师ID号:112374 学生姓名:小明 学生年龄:18 学生分数:96 请按任意键继续. . .
(5)结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式分两种:值传递,地址传递。
值传递示例:
struct student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; void printStudent(student stu) { cout << "姓名:" << stu.name << " 年龄:" << stu.age << " 分数:" << stu.score << endl; stu.name = "无"; stu.age = 0; stu.score = 0; } int main() { student xiaoMing = { "小明", 18, 96 }; printStudent(xiaoMing); cout << "姓名:" << xiaoMing.name << " 年龄:" << xiaoMing.age << " 分数:" << xiaoMing.score << endl; system("pause"); return 0; } --------------------------------------------------------------------------- 姓名:小明 年龄:18 分数:96 姓名:小明 年龄:18 分数:96 请按任意键继续. . .
地址传递示例:
struct student { // 成员列表 string name; // 姓名 int age; // 年龄 int score; // 分数 }; void printStudent(student * stu) { cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl; stu->name = "无"; stu->age = 0; stu->score = 0; } int main() { student xiaoMing = { "小明", 18, 96 }; printStudent(&xiaoMing); cout << "姓名:" << xiaoMing.name << " 年龄:" << xiaoMing.age << " 分数:" << xiaoMing.score << endl; system("pause"); return 0; } -------------------------------------------------------------------------- 姓名:小明 年龄:18 分数:96 姓名:无 年龄:0 分数:0 请按任意键继续. . .
如果不想实参结构体内容,用值传递,反之用地址传递。
地址传递还可以使用数组,可实现同样功能,书写与阅读比指针更加直观。
(6)结构体中const使用场景
作用:用const来防止误操作
值传递会copy,会占内存空间,复制也会多花时间。所以如果可以用地址传递,可以提高执行效率。
而地址传递可能会对原始对象进行误修改,这时候就可以加 const。如果出现修改,编译器会报错
示例:
void printStudent(const student * stu) { cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl; stu->name = "无"; // 编译器会报错 stu->age = 0; stu->score = 0; }
-
struct 结构体以及 typedef struct
2014-05-04 21:29:331.C语言中,声明一个结构体如下:1.C语言中,结构体的声明如下:首先关键字struct表示接下来是一个结构,后面是一个可选的标记,用来引用该结构的快速标记。
struct book { char title[MAXN]; char author[MAXM]; float value; };
上述结构声明,是“结构设计”的意思。它告诉编译器如何表示数据,而没有让计算机为数据分配空间。
然后声明或定义一个结构体变量时,如下:
其中struct 不能省。struct book library;
综合上述的两个,可以合二为一,声明一个结构体变量:
其中可把标记book省略,如下struct book { char title[MAXN]; char author[MAXM]; float value; } library;
这两个版本的语句都是声明了一个结构体,并定义了一个该结构体变量librarystruct { char title[MAXN]; char author[MAXM]; float value; } library;
如果想多次使用一个结构体模板,就需要使用带有标记的形式;或者使用typedef,如下:
后面便可以用BOOK代替 struct book 来声明该类型变量。typedef struct book { char title[MAXN]; char author[MAXM]; float value; } BOOK;
同样,这里的结构标记可以省去。
typedef struct { char title[MAXN]; char author[MAXM]; float value; } BOOK;
2.C++中,声明一个结构体:
然后直接就可以使用 book 来定义一个该类型变量:struct book { char title[MAXN]; char author[MAXM]; float value; };
book library;
综合上两句,声明并定义一个结构体:struct book { char title[MAXN]; char author[MAXM]; float value; } library;
这里如果用typedef,则只是定义了一个别名,并没有定义变量
library 只是book的一个别名,并不是一个变量。(和C中相同)typedef struct book { char title[MAXN]; char author[MAXM]; float value; } library;
-
结构体 typedef struct
2020-09-29 17:33:44之前学过typedef struct的用法,突然忘记了,这回再看理解的更清楚了 转发 https://blog.csdn.net/wzz110011/article/details/78883838 在学习数据结构的时候,我经常遇到typedef struct,刚开始感觉很别扭,查阅... -
C | struct结构体 | 结构体数组 | typedef struct | 结构体初始化 | 结构体构造函数 | 结构体嵌套
2019-03-10 10:44:05结构体 结构体一般形式: 定义一个结构体: 结构体初试化的一般方法: 结构体数组: 结构体数组初始化与赋值 结构体构造函数 第一种构造函数形式 第二种构造函数形式 结构体 结构体一般形式: struct ... -
结构体typedef struct的用法 和结构体的定义
2017-06-15 09:57:48结构体typedef struct的用法 和结构体的定义 结构体的定义: 1. struct Person { char name[20]; char sex; float height; int age; }; 只有结构体的定义 2. struct Person { char... -
结构体typedef struct和struct
2020-03-05 18:50:301. 在C++中 (1)定义区别 struct Student ...typedef struct Student2 { int num; char name[12]; }stu2;//stu2是一个结构体类型,即stu2是Student2的别名 (2) 使用区别 可以直接访问stu1.n... -
定义结构体 typedef struct 的用法总结
2020-09-11 11:33:37typedef struct 是为了使用这个结构体方便。 具体区别在于: 若struct node { } 这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n; 若用typedef,可以这样写:typedef struct node{ }NODE; ,... -
对STM32中typedef struct结构体的理解(结构体中有无typedef的区别)
2020-11-16 11:05:44struct [结构体类型名] { 数据类型 成员名1; 数据类型 成员名2; }; 可先定义结构体类型,再用该类型名定义结构体变量。 类型定义的格式: typedef 类型 标识符; 类型定义不是定义一种新的数据类型,而是给已有的... -
C语言结构体typedef struct详解
2019-08-20 15:06:161、typedef关键字 C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE: typedef unsigned char BYTE; 在这个类型定义之后,标识符 BYTE 可作为类型... -
struct与typedef 结构体定义
2020-07-29 11:01:51struct 结构体名 变量名 = { 成员1值, 成员2值... }; 定义结构体时顺便创建变量; 这三种的具体代码如下: /* ------------------ 1.struct 结构体名 变量名; 之后进行赋值操作 ------------------ */ struct ... -
typedef struct结构体总结篇
2018-07-12 10:09:31//1、用typedef struct student{类型 变量名}STU,*STU1,在{}后面跟的STU是该结构体的变量名,*STU1是该结构体的类型的地址。 typedef struct student{ int age ; }STU ,*STUP; /* 上面的和下面的等价 typedef... -
struct和typedef struct定义结构体的区别
2020-05-06 22:41:41在《数据结构》C语言版中经常遇到定义结构体不同的方式: typedef struct和struct。它们之间的区别如下: ...typedef即给struct取别名,在C中定义结构体需要用typedef。此时stu == struct student。在声明... -
struct 结构体大小 结构体定义 位段(位域)
2021-02-13 22:50:37struct 结构体名 { int a; int b; char x; }; //需要分号 struct 结构体名 变量名; //使用方式二 声明与定义同时进行 struct 结构体名 { int a; int b; }变量名; //使用方式三 直接进行定义 struct { int a; ... -
结构体typedef
2019-05-07 16:08:43在定义结构体时,结构体中的数据只能定义而不能做其他动作如运算 ...typedef struct{ char name[10]; float Num1; float Num2; float Num3; float Num4=Num1+Num2+Num3; //这样定义结构体中的数据是完全错误... -
struct结构体
2018-05-15 09:22:10struct Point { int x; int y; }; 定义了一个结构体类型Point,声明变量时直接Point p1; 如果使用typedef,又会造成区别 struct Point { ...//p1是一个结构体变量 typedef struct Point { int x; int y; }p2; ... -
typedef struct 结构体问题
2012-10-24 20:36:34typedef struct test { int i; char buff[256]; } Test,*test; 1. Test 是这个结构体的别名,我清楚,但是*test代表什么啊,我不太清楚,是指针吗 2. *test怎么理解 谢谢!