C语言第九讲,结构体

一丶结构体的定义

在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:

struct 结构体名{
结构体所包含的变量或数组
};

结构体是一种不同数据类型的集合.可以包含不同数据.用来表示不同的方法.

例如:

  

struct stu
{
TCHAR *Name;
int nId;
....
}

结构体是一种复合类型,为什么这么说.因为结构体是程序员来进行定义以及编写的.

结构体的构成则是基本数据类型进行构成的.基本数据类型(char short int ...)是不可以在进行拆分了.

而结构体可以进行拆分.

二丶结构体变量

结构体虽然是程序员定义的.但是我们要使用.所以可以进行定义变量来使用

1.结构体定义

语法:

  

关键字 结构体定义名字 变量;
struct stu st1;

则st1就是结构体变量.

2.结构体变量初始化

结构体变量初始化有几种常用方式.

.定义的时候初始化
struct stu
{
...
} st1,st2;
声明了st1,st2变量
.大括号初始化 struct stu st1 = {..,..};
.单个成员赋值.
st1.name = xxx.
.同结构体变量可以给同结构体变量赋值.
st1 = st2;

3.结构体的访问:

 

    变量.类型名
st1.name = "张三"

三丶结构体数组

1.结构体数组的定义

结构体数组,顾名思义.如果我们想使用多个这种变量.总不能定义多次的变量吧.那么我们直接定义为一个数组即可.

而这个就叫做结构体数组.

语法;

  

关键字  结构体名字
{
....
}st1[];
st1是结构体数组的首地址,表明了数组有5个st1一样的结构体.

当然,上面使用的是定义初始化.那么我们还可以使用变量直接定义进行定义数组.

struct stu st1[];

2.结构体数组的初始化

结构体数组的初始化可以进行大括号初始化.

例如:

  

struct stu
{
..
}st1[] = {
{xxx,xxx},
{xxx,xxx},
{xxx,xxx},
{xxx,xxx},
{xxx,xxx}
};
想象成定义了五组,那么我对每一组进行初始化即可.

四丶结构体指针

1.定义

我们知道,C语言的灵魂就是指针.指针可以做的事情很多.

那么结构体和指针也很常用.

语法:

  

struct stu  st1;
struct stu *pSt1 =&st1;
则pst1保存了st1的首地址.
我们进行访问
pst1->name = xxx;

注意的问题:

  数组和指针组合的时候. 我们的 数组名字可以当做数组指针给指针赋值.

例如:

  

int a[];

int *p = a;

不用加取地址符号,但是结构体变量不能这样.你想赋值给指针.那么比如加上取地址符号(&)

例如:

  

struct stu *pst1 = &st1

2.访问

访问的时候我们的语法:

  

(*结构体指针).成员名字.
例如:
(*pstu1).name = xxx;
或者
pstu1->name = xxx;

五丶结构体指针作为函数参数问题

1.了解传值,传址的区别.

我们知道,一个结构体的成员可能有很多.当我们定义结构体的时候,其实底层会根据我们的结构体成员.

算出对齐值,然后进行申请内存.

当我们作为函数参数的时候,如果直接传结构体变量.那么我们的函数参数.相当于拷贝了一份.

这样特别消耗内存.

例如:

  

void ChangeValue(struct stu st1)//这里的st1是形参,如果传值,相当于新申请的变量
{
st1.name = xxx;
} int main()
{
struct stu st1;
st1.name = yyy;
ChangeValue(st1); }

上面的代码,我们在main中修改名字为yyy,当传入st1给函数的时候,其实 函数的st1相当于新申请

的变量.拷贝了我们的实际参数(main中传参位置的st1叫做实际参数),我们在函数内部改为xxx

其实不会改变实际参数的值,也就是说实际参数还是yyy

只不过传值的时候,形参相当于拷贝了一份而已.

2.传地址.

如果我们想改变实际参数的值,那么把地址传过去就可以了.我们要知道,指针(地址)就是4个字节.

所以我们拷贝过的是地址,根据地址修改里面的值,则可以进行修改.这个就是传址

例如:

  

void ChangeValue(struct stu *pst1)//这里的st1是形参,如果传值,相当于新申请的变量
{
pst1->name = xxx;
} int main()
{
struct stu st1;
st1.name = yyy;
ChangeValue(&st1); }

这样修改完之后,实际参数的值是YYY

 

C语言第九讲,结构体的更多相关文章

  1. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  2. Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...

  3. 4-17疑难点 c语言之【结构体对齐】

    今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...

  4. C 语言实例 - 使用结构体(struct)

    C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...

  5. Verilog缺少一个复合数据类型,如C语言中的结构体

    https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...

  6. GO学习-(13) Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  7. Go语言教程之结构体

    Hello,大家好,我是小栈君,最近因为工作的事情延误了一点分享的进度,但是我会尽量抽时间分享关于IT干货知识,还希望大家能够持续关注"IT干货栈"哦. 闲话不多说,今天给大家继续 ...

  8. Go语言基础之结构体(面向对象编程上)

    1 自定义类型和类型别名 1.1 自定义类型 Go语言中可以基于一些基本的数据类型,使用type关键字定义自定义类型的数据 . 自定义类型定义了一个全新的类型,该新类型具有基本数据类型的特性.自定义类 ...

  9. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

随机推荐

  1. PHP开发——基础

    简介 l  PHP Hypertext Preprocessor 超文本预处理器,是嵌入到HTML文件中的服务器端的脚本语言: l  一个PHP文件中,可以包含多种代码:HTML.CSS.JS.Jqu ...

  2. journalctl 清理journal日志

    在CentOS 7开始使用的systemd使用了journal日志,这个日志的管理方式和以往使用syslog的方式不同,可以通过管理工具维护. 使用df -h检查磁盘文件,可以看到/run目录下有日志 ...

  3. vnc 搭建 转

    这里要注意,关闭selinux setenforce 0 原文地址: http://www.linuxidc.com/Linux/2015-04/116725.htm 这是一个关于怎样在你的 Cent ...

  4. HTML第二篇

    1>压缩文件格式:使用.zip格式较好 2>charset(字符集)  国内最新字符集格式为:gb18030   国际上通用的字符集是:UTF-8 3>添加图片 <img sr ...

  5. windows远程桌面连接时,显示发生身份验证错误,给函数提供的身份无效

    摘自:https://www.landui.com/help/show-7787 初次看到这个错误的时候懵了.访问给的地址一看,发现大概意思是不安全了,微软要更新一下 凭据安全支持提供程序协议 (Cr ...

  6. 文字创作类App分享-简书

    今天我用Mockplus做了一套简书App的原型,这是一款文字创作类的App,用户通过写文.点赞等互动行为,提高自己在社区的影响力,打造个人品牌.我运用了Mockplus基础组件.交互组件.移动组件等 ...

  7. 重读<<大话设计模式>>读书笔记一

    面向对象编程几大原则: 1.简单工厂模式 解读:根据不同条件,动态创建合适的对象. 目的: 解决对象创建问题 举例: 计算器根据不同情况,创建适合的对象来处理数据. 2.策略模式 解读:也是根据不同的 ...

  8. java对PDF文档的各种操作

    https://www.cnblogs.com/h--d/p/6150320.html(仅以提醒,导航的作用)

  9. 8. American Friendship 美国式的友谊

    8. American Friendship 美国式的友谊 (1) Americans usually consider themselves a friendly people.Their frie ...

  10. Springmvc <mvc:cros>和<mvc:intercepters>同时使用时,跨域被拦截了

    问题原因:cros也是使用拦截器实现的,并且拦截器配置最后一个处理,导致在跨域处理之前调用了业务拦截器 解决方案:推荐使用http://software.dzhuvinov.com/cors-filt ...