加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_梅州站长网 (https://www.0753zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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)我们可以明确算出结构体的大小啊!
 

(编辑:云计算网_梅州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!