0


C语言结构体(初识struct)

C语言萌新入门学习记录屎

第003章——初识结构体(struct)


C语言结构体


结构体是什么?

结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型(整型、浮点型、字符型、指针型和无值型)。构成结构的每一个类型变量称为成员,它和数组的元素一样,但数组中元素是以下标来访问的,而结构是按变量名字来访问成员的。
在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同类型,成员一般用名字访问。

其实说白了,就是把一些变量组合一起来,比如你要用一个结构体描述一个学生信息:{学生名字;学生年龄;学生成绩}。


一、结构声明(struct关键词)

(1)语法格式:

struct 结构名{
    成员列表;};

(2)举例

//创建一个类型structStu{char name[20];//注意:此处的20表示名字的长度,而非20个名字int age;double score;};

二、结构体变量

定义结构体变量

struct Stu 结构体变量名;

structStu s ={"张三",20,98.9};

也可以在定义结构体时直接定义结构变量并赋值:

structStu{char name[20];int age;double score;}s ={"张三",20,98.9};

当然也可以使用typedef

//利用 typedef 定义这个结构体typedefstruct{char name[6];int age;double price;}stu;intmain(){
    stu s ={"张三",20,98.9};//结构体初始化printf("%s %d %lf\n",s.name,s.age,s.price);}

其外,typedef也可以为已有结构取别名。
例如:我现在有一个结构:student

structstudentsedfesgvsfesf{char name[20];int age;double score;};

定义变量的时候你就是struct studentsedfesgvsfesf s ={…;…;…}
你嫌烦,然后就可以使用typedef起别名啦

typedefstructstudentsedfesgvsfesf stu

现在你的结构体就叫stu啦!
也可以使用define

#definestudentstructstu
student{char name[6];int age;double price;};intmain(){
    student s ={"张三",20,98.9};printf("%s %d %lf\n",s.name,s.age,s.price);}

也就是用define宏定义一个常量来表示一个结构体

额外(define和typedef的区别)

  • define是预处理指令,在编译时不进行任何检查,只进行简单的替换,typedef是一种存储类的关键字。
  • typedef用来定义类型的别名,便于记忆。define除了取别名,还能定义常量、变量、编译开关等。
  • typedef 能够保证定义的所有变量均为同一类型,而 define 则无法保证。(此处仅展示对指针操作)
#definestuint*;
s s1,s2;

s1,s2类型不同,s1为指向整型的指针变量,s2为整型变量。

typedefint* stu;
s s1,s2;//s1,s2 类型相同

s1,s2类型同为指向整型的指针

三.获取结构体成员

结构体变量.成员变量

和python中的实例化对象意思差不多

printf("%s %d %lf\n",s.name,s.age,s.score);

运行结果:

张三 2098.90

整合一下代码:

structStu{char name[2];int age;double price;};intmain(){structStu s ={"张三",20,98.9};printf("%s %d %lf\n",s.name,s.age,s.score);}

诶,然后你发现怎么复制博主的代码报错咧。对是的,注意看char name[2];对呀,你不是之前说[ ]里面的数表示是字符串的长度嘛,没错啊。
漏!!!
问题:在UTF-8编码中:一个英文字符等于1个字节,一个中文(含繁体)等于3个字节。
现在赶紧去查看查看,你得默认编码格式吧。
在这里插入图片描述左下角的小齿轮- ->设置- ->输入encoding,查看自己的编码格式。

扩充:C语言中英文字符占用字节长度

  • ASCII码中:一个英文字母占1个字节(byte),一个中文汉字占2个字节。
  • UTF-8编码中:一个英文字符占1个字节,一个中文(含繁体)占3个字节。
  • Unicode编码中:一个英文字符占2个字节,一个中文(含繁体)占2个字节。注意:英文标点占1个字节;中文标点占2个字节。
  • UTF-16编码中:一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。
  • GBK编码中:一个英文字母字符占1个字节,一个中文占2个字节。

好知道了这些,那我再来,我这么写:

structStu{char name[6];};intmain(){structStu s ={"张三"};printf("%s\n",s.name);}

结果运行结果是:

张三n、张三~、张三j......(反正就是张三+一个随机字符)

看到这里,大概大家应该也意识到了问题
c语言字符串中有一个隐藏的结束标志“\0”,虽然“\0”不计入字符串长度,但是要占用内存空间一个字节,所以要留出一个字节存储“\0”。此处详细可看主页,某文章(还没写,过两天写)

四、结构体变量和指针

结构体类型指针访问成员的获取和赋值形式:

(*变量名).成员名

struct Stu* 表明指针类型为结构体指针

structStu{char name[2];int age;double price;};intmain(){structStu s ={"张三",20,98.9};structStu* p =&s;//取缔值符&来取s地址printf("%s %d %lf\n",(*p).name,(*p).age,(*p).score);}

理解一下就是,p为指针,前面加个*解引用一下,就是s嘛,可以理解为(*p)=s

当然还有更简单的写法

结构体指针->成员变量

printf("%s %d %lf\n",p->name,p->age,p->score);

先找到指针指向的对象,然后再找成员。(->指向符)


总结

以上就是今天要记录的内容,本文仅仅简单介绍了对结构体的初印象(小白专属,当然我也是初学),希望有所帮助。


本文转载自: https://blog.csdn.net/qq_64318258/article/details/126037708
版权归原作者 afool�‍♂️ 所有, 如有侵权,请联系我们删除。

“C语言结构体(初识struct)”的评论:

还没有评论