C语言结构体定义 C语言 结构体的定义及使用

www.zhiqu.org     时间: 2024-05-23

C语言结构体定义:struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。

结构体是C语言中聚合数据类型(aggregatedatatype)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

扩展资料

1、struct是声明结构体类型时必须使用的关键字,不能省略。“结构体”这个词是根据英文单词structure译出的。

2、structSTUDENT是定义的数据类型的名字,它向编译系统声明这是一个“结构体类型”,包括name、num、sex、age、score、addr等不同类型的项。

3、structSTUDENT与系统提供的int、char、float、double等标准类型名一样,都是数据类型,具有同样的作用,都是用来定义变量的。

参考资料来源:百度百科—结构体



  struct在C语言中是一个关键字,用于定义结构数据类型。


  问题中的两种定义的区别在于第一种是给student数据类型,重新定义了一个类型别名,而第二种则单纯的表示一种叫做student的数据结构类型。两者的主要区别在于后面直接定义变量时。如下代码,则可以直接在结构体后面定义一个zhang_san的结构体变量。

struct student
{
int num;
struct student *next;
}zhang_san;

  而第一种的定义,则会出现错误。

typedef struct student
{
 int num;
 struct student *next;
}student zhang_san;

  
扩展:

  “结构”是一种构造数据类型,现在一般叫做用户自定义数据类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。


  定义一个结构的一般形式为:

struct结构名
{
//成员表列
};


  成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:“类型说明符 成员名;”。成员名的命名应符合标识符的书写规定。例如:

struct stu
{
    int num;
    char name[20];
    char sex;
    float score;
};


  在这个结构定义中,结构名为stu,该结构由4个成员组成。 第一个成员为num,整型变量;第二个成员为name,字符型数组;第三个成员为sex,字符型变量;第四个成员为score,浮点型变量。 应注意在括号后的分号是必不可少的。



第二个struct student是定义了一个student结构体,这个明白吧。

第一个是用typedef把struct student这个结构体类型名字重新定义为student,也就是说struct student和student表示同一个事物,都是一个类型的标识符,比如 typedef int zhengshu; 就是你把整型int重命名为zhengshu,下面定义:int i; 和 zhengshu i; 两句就是等价的了

第一种是定义一个结构体并取个student结构体名,下次定义结构体是:
只要:student <标识符>; 乳student stu;
而第二种:必须这样定义:struct student stu;

c语言中如何定义一个结构体~

结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明。

扩展资料:

一、结构体作用:
结构体和其他类型基础数据类型一样,例如int类型,char类型,只不过结构体可以做成你想要的数据类型,以方便日后的使用。
在实际项目中,结构体是大量存在的,研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。

二、结构体的大小与内存对齐:
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。
所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。
程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
三、结构体的规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
参考资料来源:百度百科-结构体

C语言_071_指针的定义和使用_上


#驷胞米# C语言中结构体类型名与变量名区别? -
(15047287390): 结构体名字是类型名,变量名是实体名,一个类型可以有许多实体. 具体操作,举例讲解如下: 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2: struct LNode { int ...

#驷胞米# c语言大作业要求:程序中要具备结构体类型的数据操作,是什么意思? -
(15047287390): 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 };结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的...

#驷胞米# c语言结构体
(15047287390): 你自己再看看吧 我给你修改的这个 #include<stdio.h> void main() { struct student {char name[10]; int math,eng; float aver;}s[4]; int i; for(i=0;i<3;i++) { scanf("%s%d%d",s[i].name,&s[i].math,&s[i].eng); s[i].aver=(s[i].math+s[i].eng)/2; } for(i=0;i<2;i++) ...

#驷胞米# C语言结构体数组 -
(15047287390): scanf_s("%s %d %d %d", s[p].name,10,s[p].score[0],1, s[p].score[1],1, s[p].score[2]),1; 前面的name不用加& 因为是数组名 但是后面的score都需要加&的啊、

#驷胞米# 结构体定义对象 -
(15047287390): 很正常,标准不一样编译的结果也不一样.你自己在注释里面不是也说了吗?//加上struct的结构体变量定义是C语言的特征,而C++语言不需要这样 你可以试试看把这个文件后缀名改为.c,然后把所有C++相关的代码都去掉,变成这样: //定义结构体 struct point { //包含两个变量成员 int x; int y; }; int main(int argc, char *argv[]) { point pt; //加上struct的结构体变量定义是C语言的特征,而C++语言不需要这样 pt.x=1; pt.y=2; return 0; }再编译试试看,就会报错了

#驷胞米# C语言表示的数据结构 -
(15047287390): typedef struct { elenmenttype data; struct node *next }node; 这是一个链表中的节点的结构体,里面有数据域,和一个指针,next指针指向下一个结点,他其中存放下一个结点的地址,node在英文里是结点的意思,typedef是在c语言中是一个关键字,简单的说例如typedef int data ;以后再这个程序中的int类型都可以用data来表示,所以这个node可以代表此结构体,也就是结点.s->next=p->next//s的next中存放p的next地址,p->next=s// 将s的地址放在p的next中,这两个是指将s插入到p之后

#驷胞米# C语言结构体
(15047287390): #include "stdio.h" typedef struct student{ int num; int age; char name[10]; char sex; double score[5]; }stu_t; void main(){ stu_t ss[5]={ {1,20,"Lily",'W',{90,80,70,93.5,78.5}}, {2,22,"Lucy",'W',{80,80,70,93.5,78.5}}, {3,21,"Lee",'M',{90.5,80.5,...

#驷胞米# C语言结构体,不懂呀,玩STM32的来看看 -
(15047287390): 这个结构体是里面的成员有普通的成员变量,也有函数指针,你首先应该弄懂 u8具体是什么类型,u16是什么类型 在C语言中自定义一个类型很常见 如:typedef char CT; char ch 相当于 CT ch

#驷胞米# c语言中结构体的优点 -
(15047287390): 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型.首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同.第三,节省内存空间 第四,高效率.