Linux-C P10 结构体细讲
关于结构体,在数据类型(Linux-C P2 数据类型)里已经做了简要的讲解
但对于后面的内容,结构体是一个很重要的数据类型
因此本文会对其进行详细的讲解,包括结构体的基础、结构体数组和结构体指针
结构体基础
结构体定义
对于数组,它是能够存储若干相同数据类型的结构,但是如果有许多信息且不是同一数据的类型需要组合成一个整体来进行描述,那么数组就没有办法
所以结构体由此诞生了,结构体的使用为处理复杂的数据结构提供了有效的手段,为函数间传递不同类型的数据提供了方便
一般形式
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}
例如你要定义一只羊的信息
struct Yang
{
char name[20];
int age;
char sex;
int weight;
...
}
结构体类型的特点
1.结构体类型是用户自行构造的
2.它由若干不同的基本数据类型的数据构成
3.它属于C语言的一种数据类型,与整型、浮点型相当,所以只有用它定义变量时才分配空间
结构体声明
定义完结构体之后,就需要来声明结构体了,关于结构体的声明有几种方法,下面一一列举
方法一
先声明结构体类型再定义变量名
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}
struct 结构体名 变量名1;
同样以羊为例
struct Yang
{
char name[20];
int age;
char sex;
int weight;
...
}
struct Yang yang1;
方法二
在声明类型的同时定义变量
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}变量名1,变量名2....
同样以羊为例
struct Yang
{
char name[20];
int age;
char sex;
int weight;
...
}yang1,yang2;
方法三
直接定义结构类型变量
struct
{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}变量名1,变量名2....
同样以羊为例
struct
{
char name[20];
int age;
char sex;
int weight;
...
}yang1,yang2;
这里不需要定义结构体名,而是直接定义了变量名
对于前面两种情况方法三的定义是最简单的,但是要在后面再定义机构体变量是需要结构体名的,因此需要用到方法一和方法二来声明与定义
结构体初始化
对于结构体的初始化,可以这样进行赋值
一般形式
变量名.成员名 = 变量值;
关于具体的初始化,有两种方法
方法一
直接进行逐一赋值
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}
struct 结构体名 变量名1;
变量名1.成员名1 = 变量值1;
变量名1.成员名2 = 变量值2;
...
变量名1.成员名3 = 变量值3;
方法二
声明与定义时直接对变量名进行赋值
可以在单独定义变量的时候初始化
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}
struct 结构体名 变量名1={变量值1,变量值2....变量值n};
也可以在声明变量的时候定义变量的时候初始化
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
...
数据类型 成员名n;
}变量名1={变量值1,变量值2....变量值n};
结构体使用
针对结构体的定义、声明和初始化已经做了详细的讲解,接下来就来耍耍它吧!
举个栗子
这里做一个简单的结构体定义、声明、初始化并打印出信息的栗子
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
struct Yang
{
char name[20];
int age;
char sex;
int weight;
}yang1,yang2={"hhhh",5,'m',15};
struct Yang yang3={"wwww",3,'f',12};
strcpy(yang1.name,"ffff");
yang1.age = 6;
yang1.sex = 'm';
yang1.weight = 20;
printf("yang1.name = %s,yang1.age = %d,yang1.sex = %c,yang1.weight = %d\n",
yang1.name,yang1.age,yang1.sex,yang1.weight);
printf("yang2.name = %s,yang2.age = %d,yang2.sex = %c,yang2.weight = %d\n",
yang2.name,yang2.age,yang2.sex,yang2.weight);
printf("yang3.name = %s,yang3.age = %d,yang3.sex = %c,yang3.weight = %d\n",
yang3.name,yang3.age,yang3.sex,yang3.weight);
return 0;
}
这里进行了简单的演示,现在给这个栗子加点料,在结构体中定义结构体试试
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
struct Yang
{
char name[20];
int age;
char sex;
int weight;
struct Message
{
char place[20];
char varieties[30];
int id;
}message;
}yang1;
strcpy(yang1.name,"yyyy");
yang1.age = 6;
yang1.sex = 'm';
yang1.weight = 21;
strcpy(yang1.message.place,"内蒙古");
strcpy(yang1.message.varieties,"鄂尔多斯细毛羊");
yang1.message.id = 10034;
printf("yang1.name = %s,yang1.age = %d,yang1.sex = %c,yang1.weight = %d\n",
yang1.name,yang1.age,yang1.sex,yang1.weight);
printf("yang1.place = %s,yang1.varieties = %s,yang1.id = %d\n",
yang1.message.place,yang1.message.varieties,yang1.message.id);
return 0;
}
结构体数组
机构体数组定义
当结构体变量足够多的时候,每次都单独定义一个变量就会变的很麻烦,因此结构体数组就出现了,这里的数组指的是定义的结构体变量是数组的形式
一般形式
struct 结构体名 变量名[元素个数];
这样的话就可以很方便的定义n个结构体变量
结构体数组使用
因此对于栗子一里面的定义的三个结构变量,这里可以同时赋值
举个栗子
对栗子一进行改造
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
int i;
struct Yang
{
char name[20];
int age;
char sex;
int weight;
}yang[3] = {{"ffff",6,'m',20},
{"hhhh",5,'m',15},
{"wwww",3,'f',12}};
for(i = 0;i < 3;i++){
printf("yang[%d].name = %s,yang[%d].age = %d,yang[%d].sex = %c,yang[%d].weight = %d\n",
i,yang[i].name,i,yang[i].age,i,yang[i].sex,i,yang[i].weight);
}
return 0;
}
结构体指针
结构体指针定义
可以设定一个指针变量用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址,该指针称为结构体指针
一般形式
struct 结构体名 *结构体指针
结构体指针使用
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
struct Yang
{
char name[20];
int age;
char sex;
int weight;
};
struct Yang *p;
strcpy(p->name,"ffff");
p->age = 6;
p->sex = 'f';
p->weight = 13;
printf("p->name = %s,p->age = %d,p->sex = %c,p->weight = %d\n",
p->name,p->age,p->sex,p->weight);
return 0;
}
p+1 指向yang[1]的首地址的内容
++p 指向yang[1]的首地址的内容
p++ 在程序执行后,指向yang[1]的首地址的内容
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
int i;
struct Yang
{
char name[20];
int age;
char sex;
int weight;
}yang[3] = {{"ffff",6,'m',20},
{"hhhh",5,'m',15},
{"wwww",3,'f',12}};
struct Yang *p;
p = &yang[0];
for(i = 0;i < 3;i++){
printf("yang[%d].name = %s,yang[%d].age = %d,yang[%d].sex = %c,yang[%d].weight = %d\n",
i,yang[i].name,i,yang[i].age,i,yang[i].sex,i,yang[i].weight);
}
printf("s = %s\n",p+1);
printf("s = %s\n\n",p);
printf("s = %s\n",++p);
--p;
printf("s = %s\n\n",p);
printf("s = %s\n",p++);
printf("s = %s\n",p);
--p;
printf("s = %s\n\n",p);
return 0;
}