第003章——初识结构体(struct)
结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。结构中可以使用不同的数据类型(整型、浮点型、字符型、指针型和无值型)。构成结构的每一个类型变量称为成员,它和数组的元素一样,但数组中元素是以下标来访问的,而结构是按变量名字来访问成员的。
在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同类型,成员一般用名字访问。
其实说白了,就是把一些变量组合一起来,比如你要用一个结构体描述一个学生信息:{学生名字;学生年龄;学生成绩}。
struct 结构名{
成员列表;
};
//创建一个类型
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 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,查看自己的编码格式。
好知道了这些,那我再来,我这么写:
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);
先找到指针指向的对象,然后再找成员。(->指向符)
以上就是今天要记录的内容,本文仅仅简单介绍了对结构体的初印象(小白专属,当然我也是初学),希望有所帮助。