C语言第九讲,结构体

C语言第九讲,结构体

一丶结构体的定义

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

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

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

例如:

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

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

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

而结构体可以进行拆分.

二丶结构体变量

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

1.结构体定义

语法:

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

则st1就是结构体变量.

2.结构体变量初始化

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

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

3.结构体的访问:

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

三丶结构体数组

1.结构体数组的定义

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

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

语法;

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

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

struct stu st1[5];

2.结构体数组的初始化

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

例如:

struct stu
{
..
}st1[5] = {
                    {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[5];

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Hongten

java开发_""和null的区别

19020
来自专栏猿人谷

const用法小结

常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。因此,定义或说明常类型时必须进行初始化。 概述 1. const有什么...

19170
来自专栏前端正义联盟

一道 js 闭包面试题的学习

最近看到一条有意思的闭包面试题,但是看到原文的解析,我自己觉得有点迷糊,所以自己重新做一下这条题目。

40340
来自专栏Nian糕的私人厨房

ECMAScript6 解构赋值

在 ES6 中,关于解构的含义为:允许按照一定模式,从数组和对象中提取值,对变量进行赋值,而数组、对象和字符串,都能通过这种方式进行赋值

8540
来自专栏wym

运算符重载(超详细)

C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋...

18720
来自专栏编程

Python基础知识2:字典

字典一种key - value 的数据类型,就像上学用的字典通过拼音查找汉字一样;字典是Python语言中唯一的映射类型。字典对象是可变的,它是一个容器类型,能...

251100
来自专栏鸿的学习笔记

python的对象引用

Every object has an identity, a type and a value. An object’s identity never cha...

13330
来自专栏Java帮帮-微信公众号-技术文章全总结

String中的null,以及String s;等区别详解

1、判断一个引用类型数据是否null。 用==来判断。 2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM...

38540
来自专栏Java 源码分析

静态内部类

定义:静态内部类,定义在类中,任何方法外,用static定义;静态内部类只能访问外部类的静态成员。 注意点: 一般情况下,如果一个内部类不是被定义成静态内部类,...

33780
来自专栏LanceToBigData

JavaSE(四)之接口、访问控制

上面我们学习了几个修饰符,在开发中经常会用的到,所以必须熟练的掌握。接下来我学习一下接口和访问控制。 一、接口 一系列方法的声明,是一些方法特征的集合,一个接口...

25370

扫码关注云+社区

领取腾讯云代金券