C语言学习!
目录
????????将多个数据的集合对应到程序中时,最好在将其聚合后再对应。结构体表示任意类型的数据的集合,最适合用来实现这种结构的数据。
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
辨析:
结构体应用:复杂对象的描述就会使用到结构体。
struct tag
{
member - list;//结构体成员
}variable - list;
- struct 结构体关键字。
- tag 结构体标签,也就是结构名。
- member - list 结构体成员列表,实际程序中是多个成员。
- variable - list 变量列表,可省略。
代码示例1:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
};
int main()
{
struct Peo p1;//结构体变量的创建
return 0;
}
????????上述代码中:
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
};
这一块是数据类型的声明,并不定义变量的实体。
? ? ? ? 要保存名字、电话等数据,需要像代码示例中:
struct Peo p1;
声明和定义实体变量。struct Peo 是类型名,其中?Peo 只是结构名。意思是声明?struct Peo 型的变量 p1 。
代码示例2:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
}p1,p2;
int main()
{
return 0;
}
????????示例2中 p1、p2 是使用 struct Peo 结构类型创建的两个变量,是两个全局的结构体变量。
????????结构的成员可以是标量、数组、指针,甚至是其他结构体。
代码示例:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
};
struct St
{
struct Peo p1;
int* pi;
char arr[5];
double a;
};
int main()
{
struct St s1;//结构体变量的创建
return 0;
}
代码示例:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
}p2, p3;
struct Peo p4, p5;
int main()
{
struct Peo p1;
return 0;
}
? ? ? ? 代码中p1、p2、p3、p4、p5都是创建的结构体变量,其中p1是局部变量,p2、p3、p4、p5是全局变量。
代码示例:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
};
int main()
{
struct Peo p1 = { "小明","18833339999","男",183 };
struct Peo p2 = { "小梅","15566668888","女",165 };
return 0;
}
监视窗口:
????????当结构体的变量类型中有结构体如何初始化。
代码示例:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
};
struct St
{
struct Peo p;
int* pi;
char arr[5];
double a;
};
int main()
{
int i = 0;
struct Peo p1 = { "小明","18833339999","男",183 };
struct St s2 = { { "小梅","15566668888","女",165 },&i,{1,2,3,4,5},3.14 };
return 0;
}
监视窗口:
????????结构体变量访问成员:结构变量的成员是通过点运算符(.)访问的。点操作符接受两个操作数。
运算符(.)? ? a.b? ? ? 表示结构体a的成员b
代码示例:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
};
struct St
{
struct Peo p;
int* pi;
char arr[5];
double a;
};
int main()
{
int i = 0;
struct Peo p1 = { "小明","18833339999","男",183 };
struct St s2 = { { "小梅","15566668888","女",165 },&i,{1,2,3,4,5},3.14 };
printf("%s,%s,%s,%d\n", p1.name, p1.tele, p1.sex, p1.hight);
printf("%s,%s,%s,%d,%p,{ %d %d %d %d %d },%f\n", s2.p.name, s2.p.tele, s2.p.sex, s2.p.hight, s2.pi, s2.arr[0], s2.arr[1], s2.arr[2], s2.arr[3], s2.arr[4], s2.a);
return 0;
}
运行结果:
小明,18833339999,男,183
小梅,15566668888,女,165,0095FED8,{ 1 2 3 4 5 },3.140000
????????结构体指针访问指向变量的成员:指向一个结构体的指针访问成员是通过箭头运算符(->)访问的。
->?运算符? ? ? a->b? ? ? 用指针访问结构体a中的成员b
代码示例:
#include <stdio.h>
struct Peo
{
char name[20];
char tele[12];
char sex[5];
int hight;
};
void print1(struct Peo p)
{
printf("%s,%s,%s,%d\n", p.name, p.tele, p.sex, p.hight);//结构体变量.成员变量
}
void print2(struct Peo* p)
{
printf("%s,%s,%s,%d\n", (*p).name, (*p).tele, (*p).sex, (*p).hight);
printf("%s,%s,%s,%d\n", p->name, p->tele, p->sex, p->hight);//结构体指针->成员变量
}
int main()
{
struct Peo p1 = { "小明","18833339999","男",183 };
struct Peo p2 = { "小梅","15566668888","女",165 };
print1(p1);
print2(&p2);
return 0;
}
运行结果:
小明,18833339999,男,183
小梅,15566668888,女,165
小梅,15566668888,女,165
? ? ? ? print2 函数传递的是地址,将指针作为参数的接收,因此形参 p 就是指向 Peo 结构体的指针类型。
???????? print2 函数的形参 p 接受的是指向结构体对象 p2 的指针,在指针变量前加上指针运算符 * 就表示该指针指向的对象实体,即 *p 是 p2 的别名,所以通过?(*p).name 可以表示 p 指向的对象的成员。
????????(*p).name 和 p->name 是等价的。
? ? ? ? 5.2?中的代码 print1 函数和 print2 函数都进行了函数传参,这两个函数中首选 print2 函数的传参方式,因为若结构体过大传递地址比传递结构体对象更节省空间。
结论: 结构体传参的时候,要传结构体的地址。
????????以上就是今天要讲的内容,本文仅仅简单介绍了结构体。