PHP变量 结构体的理解
发布时间:2022-09-30 11:39:20 所属栏目:PHP教程 来源:
导读: 结构体
前言
记录对于结构体知识的了解
结构体?
结构体是一种复杂类型对象,可以用来描述一些复杂对象;
比如说:对于一个人来说,他不光只有年龄、身高、体重、姓名等
前言
记录对于结构体知识的了解
结构体?
结构体是一种复杂类型对象,可以用来描述一些复杂对象;
比如说:对于一个人来说,他不光只有年龄、身高、体重、姓名等
|
结构体 前言 记录对于结构体知识的了解 结构体? 结构体是一种复杂类型对象,可以用来描述一些复杂对象; 比如说:对于一个人来说,他不光只有年龄、身高、体重、姓名等,我们通过基本数据类型无法来描述它,为此我们得想办法,解决他啊!C语言为我们提供了struct关键字来解决这个问题,利用struct关键字我们可以用来定义结构体,把这些原本单个的数据给它打包在一起,形成一个新的类型; 那么struct怎么用呢? 举个例子,比如说我们要描述人: struct Person { char name[20]; char sex[5]; int age; } 我们想这样定义就好了,其中struct Person就是和int 、char、double同等地位的东西了,struct Person也是一个数据类型,只不过它是复杂数据类型,由基本数据类型组成,能描述的信息也就更多。这也是C语言的灵魂之一; 基本语法就是: struct +类型名 { 成员变量; };//主义这里要加分号结尾; 因此我们有了这样的一个类型,我们该如何定义变量呢? 定义变量 上面我们说了struct定义出来的复杂数据类型和基本数据类型是一样的地位,都是类型,那么自然的定义变量的方式也是一样的; 基本数据类型是怎么定义的我们就怎么定义: 在这里插入图片描述 红色部分是我们的类型,黑色部分是变量; 如何赋初值? 赋初值就和基本数据类型有所区别了,基本数据类型,只有一个,我们只需要=进行赋初值就行了;但是复杂数据类型不一样啊,它里面有多个基本数据类型,为了能给每个都赋值到位,我们应该用{ }的形式进行赋值操作,其中格式按照基本数据类型对应的格式就好了: 比如: struct Person p1={"张三","man",19}; 必须按照基本数据类型的顺序正确赋值,不能随意颠倒顺序;!!! 就像数组那样一样赋值就像了; 我们还有一直赋初值的方式: 上面一种方式不是要求我们不能颠倒赋值顺序嘛,这一种方式就是破解上一个方式的: struct Person p1={.age=19,.sex="man",.name="张三"}; 像这样的赋值方式相当于我们“指哪打哪”想给那个成员变量赋值,就给那个成员变量赋值;这里我们讲到了**.**(点)这个操作符,也就是访问结构体的方式; 结构体的访问 既然我们定义好了结构体同时也对结构体进行了相应的初始化,那么我们应该如何去访问结构体里面的数据呢? C语言为我们提供了两个操作数去解决这个问题: 在这里插入图片描述 .操作符和->操作符; .操作符是配合着普通结构体变量来使用的; ->操作符是配合结构体指针来使用的; 具体怎么使用呢,我们来具体看一看: 1、.操作符使用 在这里插入图片描述 2、->操作符使用 在这里插入图片描述 结构体的嵌套使用 当然我们的结构体不是只能由基本数据类型组成,还可以由结构体组成: 比如说: 在这里插入图片描述 注意事项 **1、**结构体并不一定要有名字,匿名结构体(没有名字的结构体也是可以的),但是该结构只能用一次;什么意思呢? 我们来看代码; 在这里插入图片描述 我们不能单独将匿名结构体拿出来创建变量,我们只能在定义结构体的的时候随便创建一个变量(类似于左边图),这就是为什么匿名结构体只能使用一次? 那么如果现在有我定义了两个一模一样的匿名结构体,编译器会认为这两个结构体是同一个数据类型吗? 我们来验证一下: 测试代码: struct { char name[20]; char sex[5]; char id[20]; int age; }str1 = { "张三","man","110112119112",10 }; struct { char name[20]; char sex[5]; char id[20]; int age; }*str2; int main() { str2 = &str1; return 0; } 在这里插入图片描述 我们可以看到虽然编译器让段代码通过了,但是还是保了个警告; 我们知道“=”两边的数据类型必须一样,现在报了警告,这说明现在“=”两边的数据类型出现了不统一,这也就说明了虽然两个匿名结构体虽然成员变量完全一模一样,但是在编译器看来他们仍然是两个不同的数据类型;当然对于两个完全相同的有名结构来说就不会存在这样的情况,编译器会直接给你报错误,说你重定义了这个数据类型: 在这里插入图片描述 **2、**对于结构体来说,它的类型名字一般都比较长,我们有没有什么办法使它的名字变得短一点;当然可以,我们可以利用typedef关键字对类型进行重名名,比如说: 在这里插入图片描述 我们利用了typedef使得原来冗长的数据类型变得简单起来了,虽然简单起来了,我们确不能滥用,因为我们利用typedef过后,代码可读性变差了,就比如:Person,单单放在这里,我们可以说他联合体类型、也可以说他是枚举类型同时也可以说他是结构体类型,给人的可读性不是太友好;当然这只是一方面的原因,同时一些公式也会对此做一些代码规范的要求,有些公式可能为了代码的可读性PHP变量,禁止使用typedef,当然有的公司则无此限制;具体怎么使用看个人情况; **3、**我们定义一个结构体最好定义在函数的外面,不要再函数内部定义,这样的话我们才能进行更多的操作和减少不必要的麻烦; **4、**结构体虽然能嵌套使用,但是不能嵌套自己; 比如这样: 在这里插入图片描述 为什么呢? 你看我们好像无法计算出struct Person这个结构体的大小对吧,我们知道name是20个字节,那struct Person是多大呢?你看我们是不是又回到了原点,似乎该计算过程在无限递归下去,我们无法求的一个准确的大小,编译器也就无法为其开辟一个合理的空间; 但是呢我们可以嵌套自己类型的指针啊,你想啊指针的大小是固定的(4/8)我们可以明确算出结构体的大小啊! (编辑:云计算网_梅州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐



浙公网安备 33038102330479号