C语言中的结构体
用户自己建立自己的结构体类型
1、 定义和使用结构体变量
(1)、结构体的定义
C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体。
(2)、声明一个结构体类型的一般形式为:
Struct 结构体名
{ 成员列表 };
1、 定义结构体类型变量
前面的也只是搭建了一个结构体类型,它相当于一个模型,并没有定义变量,其中并无具体数据,系统对之也不分配存储单元。
可以采取以下三种方法定义结构体类型的变量:
(1)、先声明结构体类型,再定义该类型的变量
(2)、在声明类型的同时定义变量
上面这种定义的一般形式为:
(3)、不指定类型名而直接定义结构体类型变量
注意:
1、 结构体类型和结构体变量是不同的概念,不要混同。区别:只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算;在编译时,对类型是不分配空间的,只对变量分配空间。
2、 结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。
3、 对结构体变量中的成员可以单独使用,它的作用与地位相当于普通变量。
1、 结构体变量的初始化与引用
在定义结构体变量时,可以对他进行初始化,即赋予初始值。
(1)、在定义结构体变量时可以对它的成员进行初始化。初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的各成员。注意:对结构体变量初始化,而不是对结构体类型初始化。
(2)、可以引用结构体变量中成员的值,引用方式为:结构体变量名.成员名
“.”是成员运算符。它在所有的运算符中优先级最高。因此可以把student1.name作为一个整体来看待,相当于一个变量。
注意:不能企图输出结构体变量名来达到输出结构体变量所有成员的值。只能对结构体变量中的各个成员分别进行输入和输出。
(3)、如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级的找到最低的一级的成员。只能对最低级的成员进行赋值、存取或运算。
(4)、对结构体变量的成员可以像普通变量一样进行各种运算。
由于“.”运算符的优先级最高,因此student1.age++是对(student1.age)进行自加运算,而不是先对age进行自加运算。
(5)、同类的结构体变量可以互相赋值。
说明:结构体变量的地址主要用作函数参数,传递结构体变量的地址。
==========================================================================
使用结构体数组
1、 定义结构体数组
(1)、定义结构体数组的一般形式是:
a、
b.先声明结构体类型(如struct Person),然后再用此类型定义结构体数组:
(2)、对结构体数组初始化的形式是在定义数组的后面加上:
==================================================================================
结构体指针
所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。
1、 指向结构体变量的指针
指向结构体变量的指针变量既可以指向结构体变量,也可以指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。
说明:为了使用方便和直观,C语言允许把(*p).name用p->name来代替,“->”代表一个箭头,p->name表示p指向结构体变量中的name成员。同样,
(*p).name等价于p->name。“->”称为指向运算符。
如果p指向一个结构体变量stu,以下三种用法等价:
(1)、stu.成员名(如:stu.name);
(2)、(*p).成员名(如:(*p).name);
(3)、p->成员名(p->name)。
2、指向结构体数组的指针
可以用指针变量指向结构体数组的元素。
注意:
如果p的初值为stu,即指向stu的第一个元素,p加1后,p就指向下一个元素,
例如:
请注意以上2点的不同。
(2)、程序定义了p,是一个指向struct Student类型对象的指针变量,它用来指向一个struct Student类型的对象,不应用来指向stu数组元素中的某一成员。例如下面的用法是不对的:
编译时将给出“警告”信息,表示地址的类型不匹配,不要认为反正p是存放地址的,可以将任何地址赋给它。如果要将某一成员的地址赋给p,可以用强制类型转换。先将成员的地址转换成p的类型。例如:
此时p的值是stu[1]元素的name成员的起始地址。可以用“ ”输出stu[1]中成员name的值。但是,p仍保持原来的类型,如果执行“
”,则会输出stu[2]中name的值。执行p++时,p的值增加了结构体struct Student的长度。
3、用结构体变量和结构体变量的指针作函数参数
将一个结构体变量的值传递给另一个函数,有3中方法:
(1)、用结构体变量的成员作参数。例如:用stu[1].name或stu[2].name作为函数实参,将实参的值传递给形参。用法和用普通变量作实参是一样的,属于“值传递方式”。应当注意实参与形参的类型保持一致。
(2)、用结构体变量作实参。用结构体变量作实参时,采取的也是“值传递”的方式,将结构体变量所占的内存单元的内容全部按顺序传递给形参,形参也必须是同类型的结构体变量,在函数调用期间形参也要占用内存单元,这种传递方式在空间和时间上的开销非常大,如果结构体的规模很大时,开销是很可观的。此外,由于采用值传递方式,如果在执行被调用函数期间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往往造成使用上的不便。
(3)、用指向结构体变量(或数组元素)的指针作实参,将结构体变量(或数组元素)的地址传给形参。
C语言中的结构体的更多相关文章
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- C语言中处理结构体的原理
汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...
- Verilog缺少一个复合数据类型,如C语言中的结构体
https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...
- C语言中的结构体和C++中的结构体以及C++中类的区别
c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一. ...
- c语言中的结构体指针类型的cast
1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针, ...
- 018_go语言中的结构体
代码演示 package main import "fmt" type person struct { name string age int } func main() { fm ...
- Go语言中的结构体 (struct)
Golang官方称Go语言的语法相对Java语言而言要简洁很多,但是简洁背后也灵活了很多,所以很多看似很简单的代码上的细节稍不注意就会产生坑.本文主要对struct结构体的相关的语法进行总结和说明. ...
- C语言中全局结构体指针隐含的错误
前天在嵌入式系统上,调试一个数组的全局变量时,发现该变量一直会动态变化.深入分析, 才发现该全局结构体没有申请内存,而是用了一个指针.这种情况编译器是检查不出来的,在linux 上运行会挂掉,但是在裸 ...
- C语言中的结构体是怎么定义的_怎么使用?
结构体的定义 // 定义结构体st struct st{ int a; // 成员a int b; // 成员b }; #include <stdio.h> struct st{ int ...
随机推荐
- Mac上MySQL忘记root密码且没有权限的处理办法&workbench的一些tips (转)
忘记Root密码肿么办 Mac上安装MySQL就不多说了,去mysql的官网上下载最新的mysql包以及workbench,先安装哪个影响都不大.如果你是第一次安装,在mysql安装完成之后,会弹出来 ...
- [C#] C# 知识回顾 - 特性 Attribute
C# 知识回顾 - 特性 Attribute [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5911289.html 目录 特性简介 使用特性 特性 ...
- vue.js初探
前言 入手2016最火前端框架之一vue.js.大概从网上找了些资料看了下vue.js,从网上的资料来看只能惊叹其发展速度太快,让我意外的是其作者是华人的前提下作品这么受欢迎. 网上的博客和教程各种组 ...
- Oracle 数据库语句大全
Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...
- 企业做数据缓存是使用Memcached还是选Redis?
企业是使用Memcached还是选Redis? 在构建一款现代且由数据库驱动的Web应用程序并希望使其拥有更为出色的性能表现时,这个问题总会时不时出现.并给每一位开发人员带来困扰.在考虑对应用程序的性 ...
- 【Java大系】Java快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品.James Gosling领 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
- Spring配置文件标签报错:The prefix "XXX" for element "XXX:XXX" is not bound. .
例如:The prefix "context" for element "context:annotation-config" is not bound. 这种 ...
- iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理
在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...
- 直播推流端弱网优化策略 | 直播 SDK 性能优化实践
弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...