C语言萌新入门学习记录屎
第003章——初识结构体(struct)
C语言结构体
C语言萌新入门学习记录屎结构体是什么?一、结构声明(struct关键词)(1)语法格式:(2)举例 二、结构体变量定义结构体变量额外(define和typedef的区别) 三.获取结构体成员扩充:C语言中英文字符占用字节长度 四、结构体变量和指针总结结构体是什么?
结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型(整型、浮点型、字符型、指针型和无值型)。构成结构的每一个类型变量称为成员,它和数组的元素一样,但数组中元素是以下标来访问的,而结构是按变量名字来访问成员的。
在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同类型,成员一般用名字访问。
其实说白了,就是把一些变量组合一起来,比如你要用一个结构体描述一个学生信息:{学生名字;学生年龄;学生成绩}。
一、结构声明(struct关键词)
(1)语法格式:
struct 结构名{成员列表;};
(2)举例
//创建一个类型struct Stu{char name[20]; //注意:此处的20表示名字的长度,而非20个名字int age;double score;};
二、结构体变量
定义结构体变量
struct Stu 结构体变量名;
struct Stu s = {"张三",20,98.9};
也可以在定义结构体时直接定义结构变量并赋值:
struct Stu{char name[20]; int age;double score;}s = {"张三",20,98.9};
当然也可以使用typedef
//利用 typedef 定义这个结构体typedef struct{char name[6];int age;double price;}stu;int main(){stu s = {"张三",20,98.9};//结构体初始化printf("%s %d %lf\n",s.name,s.age,s.price);}
其外,typedef也可以为已有结构取别名。
例如:我现在有一个结构:student
struct studentsedfesgvsfesf{char name[20]; int age;double score;};
定义变量的时候你就是struct studentsedfesgvsfesf s ={…;…;…}
你嫌烦,然后就可以使用typedef起别名啦
typedef struct studentsedfesgvsfesf stu
现在你的结构体就叫stu啦!
也可以使用define
#define student struct stu student{char name[6];int age;double price;};int main(){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 则无法保证。(此处仅展示对指针操作)#define stu int*;s s1,s2;
s1,s2类型不同,s1为指向整型的指针变量,s2为整型变量。
typedef int* stu;s s1,s2;//s1,s2 类型相同
s1,s2类型同为指向整型的指针
三.获取结构体成员
结构体变量.成员变量
和python中的实例化对象意思差不多
printf("%s %d %lf\n",s.name,s.age,s.score);
运行结果:
张三 20 98.90
整合一下代码:
struct Stu{char name[2];int age;double price;};int main(){struct Stu 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个字节。好知道了这些,那我再来,我这么写:
struct Stu{char name[6];};int main(){struct Stu s = {"张三"};printf("%s\n",s.name);}
结果运行结果是:
张三n、张三~、张三j......(反正就是张三+一个随机字符)
看到这里,大概大家应该也意识到了问题
c语言字符串中有一个隐藏的结束标志“\0”,虽然“\0”不计入字符串长度,但是要占用内存空间一个字节,所以要留出一个字节存储“\0”。此处详细可看主页,某文章(还没写,过两天写)
四、结构体变量和指针
结构体类型指针访问成员的获取和赋值形式:
(*变量名).成员名
struct Stu* 表明指针类型为结构体指针
struct Stu{char name[2];int age;double price;};int main(){struct Stu s = {"张三",20,98.9};struct Stu* 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);
先找到指针指向的对象,然后再找成员。(->指向符)
总结
以上就是今天要记录的内容,本文仅仅简单介绍了对结构体的初印象(小白专属,当然我也是初学),希望有所帮助。