结构体是类似于名片形式的数据集合体,可以把它理解为一种由用户自定义的特殊的复合型的“数据类型”,在这个复合型的“数据类型”中可以包含多种基本数据类型,我们可以把它作为一个整体来操作。
在C语言中,结构体(struct)指的是一种数据结构,是C语言中复合数据类型(aggregate>结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
结构体的定义如下所示:
structtag{member-list}variable-list;
其中:
struct为结构体关键字; tag为结构体的标志; member-list为结构体成员列表,其必须列出其所有成员; variable-list为此结构体声明的变量。 在一般情况下:tag、member-list、variable-list这3部分至少要出现2个。
不同的定义,应用在不同场景,所以,我们编程时需要结合实际情况来定义结构体。
定义结构体stu,此时结构体相当于一个类型,比如int,如需使用此结构体,方法同int.
structstu{charaa;shortbb;intcc;};structstustu1,stu2;
定义结构体stu同时定义需要使用的结构体变量stu1, stu2。如后面再需要定义结构体变量,方法同1.
structstu{charaa;shortbb;intcc;}stu1,stu2;structstustu3;
定义结构体时,结构体名称缺省,同时定义结构体变量stu1,stu2。但后面不可再定义结构体变量。
struct{charaa;shortbb;intcc;}stu1,stu2;
这里不能像上面再定义结构体变量:(以下错误)
structstu3;structstustu3;
这里先简单说下typedef。
在C和C++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了使源代码更易于阅读和理解。它通常用于简化声明复杂的类型组成的结构 ,但它也常常在各种长度的整数数据类型中看到,例如size_t和time_t。 维基百科
使用typedef定义结构体同时,给stu结构体别名STU,后续定义可不用使用struct stu,直接使用STU即可。
typedefstructstu{charaa;shortbb;intcc;}STU;STUstu1;
你会发现,其实就是通过关键字typedef,将STU取代了struct stu。
当然,也可以这么用:
structstustu1;
上面这种定义就失去了typedef的意思,所以不推荐。
使用typedef定义结构体时,省掉结构体第一个别名stu,直接在后面加STU,使用方法同上。
typedefstruct{charaa;shortbb;intcc;}STU;STUstu1;
还有一种符合语法规则,但意义不大的定义方式。
typedefstructstu{charaa;shortbb;intcc;};structstustu1;
以上这些定义方式算是语法的知识,如果还不懂,请再次复习一下。
结构体的大小,我相信很多人都没搞明白。实际编程中也是很多地方都在应用,比如:存储、拷贝结构体时都会牵涉到结构体大小的问题。
1. 对比两结构体大小,一样吗?
结构体1:
structstu{charaa;shortbb;charcc;}stu1;结构体2:structstu{charaa;charbb;shortcc;}stu2;
答案是不一样。程序测试得出sizeof(stu1)=6, sizeof(stu2)=4.
结构体计算要遵循字节对齐原则,一般满足三个准则:
结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节; 对于上面结构体stu1来说,最大字节:2字节,顺序是 char->short->char:
对于上面结构体stu2来说,最大字节:2字节,顺序是 char->char->short:
通过上面两个表格,相信你应该明白了,改成4字节的int,原理一样。
最后,强调一下,学习编程,不能只看书,要多敲代码。
C语言中"->"和"."到底有什么区别?
C语言中结构体成员的引用C语言中结构体变量的引用不能作为一个整体,只能对其中的各个成员分别进行输入和输出。 引用结构体变量中成员的方式为:结构体变量名•成员名例如:struct node{int Data;struct node *next;}a,*b;这里定义了两个变量:一个是结构体变量a,一个是指向结构体的指针变量b。 这样分别引用a, b所指结构体的成员data的写法为(*b)为了使用直观,在C语言中,将(*b)改写成b->data
一段C语言代码!
你的这个问题问的真好。 在c中,变量一般有两种存放的地方,一个是堆,一个是栈。 放在堆上的是不会因为子函数的结束而自动释放空间,而在栈上,这里你可以理解为临时租用的空间,一旦子函数结束,马上释放。 当然了,并不是堆就比栈什么都好,对栈的操作会比堆要块。 你的student stu;是在一个函数中定义的他是局部变量,在c 中,局部变量被存储在栈上,全部变量被存储在堆上。 你在主函数中调用子函数,子函数马上释放租用的空间。 注意这里的释放,并不是把租用空间里头的东西清没了,它只是释放对空间占用的权力。 下一次的数据在此之上覆盖。 所以上面的几个大虾都说你这个程序很走运,就是这个原因,恰巧你的程序在运行到第一printf的时候还没有谁去使用栈上这部分先前被getstudent()子函数使用过的空间。 所以运行正确。 接下来就不行了。 其实你如果在第一个printf运行之前如果你还有一些代码。 那么你第一个printf就非常可能运行不正确。 你去看看书上很多代码,特别是链表。 对于结构体变量,大多是用动态分配内存的方式,也就是说把这个结构体存储到堆上,然后用free语句是释放你确认没用的空间。 如果你想确定某个变量在子函数结束之外还有效,要么声明为全局的,妖媚采用动态分配内存方式。 静态分配内存也就是在编译的时候就分配好了。 而动态分配内存是在程序在运行过程中,遇到这样的动态分配语句才分配的。 事先是没有分配好的。 :)
C语言的结构体类型是什么数据?数据有哪些类型?
结构体类型就是以struct关键字定义的数据类型。 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。 是一种聚合类型,里面可以包含多种数据类型,甚至可以结构体里嵌套结构体。 相信我,等你深入理解了C言语之后,结构体在C语言里是一个神器。 C语言有五种基本数据类型:字符(char)、整型(int)、单精度实型(float)、双精度实型(double)和空类型(void)。 C语言还提供了几种聚合类型(aggregate types),包括数组、指针、结构体(struct)、共用体(联合)、位域和枚举。 结构体(Structure)是一个或多个相同数据类型或不同数据类型的变量集合在一个名称下的用户自定义数据类型。 struct 结构体名,成员列表。 因为有typedef关键字,PER实际上也就是结构体类型名,用PER可以直接定义变量。 结构体定义的格式是struct 结构体名。
发表评论