C语言-结构体-创新互联
结构体概念
typedef的作用
结构体的嵌套定义
结构体类型的嵌套定义与使用
结构体类型的成员自引用
文章名称:C语言-结构体-创新互联
本文链接:http://myzitong.com/article/dsojpc.html
由一个或多个基础类型组合出来的一个新的复合类型。
struct student_t{
int sn;
char name[32];
int age;
};
结构体变量的定义struct student_t stu;
结构体可以在全局声明,也可以在某个函数内部进行声明,但是局部声明的类型除了作用域就无法被访问。可以在声明结构体的同时定义变量。
![](/upload/otherpic24/f97573085e4196739edef02c5168ba8f.jpg)
类型定义,基于一个原始的类型 ,定义出一个新的类型。
![](/upload/otherpic24/d93aa5a2ff8b29400b50b5f9d5d486d6.jpg)
基于struct student_t类型定义了一个新的类型Student,此时的Student是一个类型。
![](/upload/otherpic24/57ea9368903d9b46332952c7111526c1.jpg)
typedef常用于复杂数据类型的类型定义,可以大大简化结构体类型名的使用。
结构体数组的定义与使用#include#includetypedef struct student_t{
int sn;
char name[32];
int age;
}Student;
typedef struct student_t Stu;
int main()
{
struct student_t stu = { 2, "小红", 18 };
Student stu1 = { 1, "小明", 18 };
Stu stu2[]={
{ 1, "小明", 18 },
{ 2, "小红", 19 },
{ 3, "小蓝", 20 }
};
for (int i = 0; i< sizeof(stu2) / sizeof(stu2[0]); i++)
{
printf("学号:%3d\t姓名:%6s\t年龄:%3d\n", stu2[i].sn, (*(stu2+i)).name, (stu2+i)->age);
}
struct student_t *pstu = &stu1;
printf("学号:%d\n", stu.sn);
printf("姓名:%s\n", stu.name);
printf("年龄:%d\n", stu.age);
printf("学号:%d\n", (*pstu).sn);
printf("姓名:%s\n", pstu->name);
printf("年龄:%d\n", pstu->age);
system("pause");
return 0;
}
![](/upload/otherpic24/78ced949e541483659eed1b6cc11f724.jpg)
#include#includetypedef struct student_t{
int sn;
char name[32];
int age;
}Student;//Student是一个类型
typedef struct class_t{
int id;
char name[32];
int stu_count;
struct student_t stu_arry[50];//嵌套定义struct student_t类型
}Class;//Class是一个类型
int main()
{
Class class = { 1, "一年级一班", 2, { { 1, "小明", 18 }, { 2, "小红", 19 } } };
printf("%10s %10s %10s\n", "班级ID", "班级名称","班级数量");
printf("%10d %10s %10d\n", class.id, class.name, class.stu_count);
for (int i = 0; i< class.stu_count; i++)
{
printf("学号:%3d\t姓名:%6s\t年龄:%3d\n", class.stu_arry[i].sn, class.stu_arry[i].name, class.stu_arry[i].age);
}
system("pause");
return 0;
}
![](/upload/otherpic24/b859100f8130797365c486a4bf86083e.jpg)
![](/upload/otherpic24/e6373aba65a1dddedbd1e14e3a740501.jpg)
结构体类型成员的类型是否可以是结构体自身类型?
![](/upload/otherpic24/7ab1c7733a3bbb4f4ce07cbc2c60b123.jpg)
stu成员定义时,student_t类型还没有定义完毕,这时候的struct student_t还不是一个完整的类型。
![](/upload/otherpic24/aa099ef73e170bf242c696ee39cc5123.jpg)
但是,定义结构体自身类型的指针是可以的。因为,指针类型的成员变量大小固定,跟结构体类型是否定义完毕无关。
结构体成员的存储struct student_t{
int sn;//4字节空间
char name[32];//32字节空间
}stu;
stu变量的存储:结构体中每一个成员变量都要占空间,成员变量的名称就代表了一整块空间中的某个子块。
stu.sn=1;
strcpy(stu.name,"hello");//字符串的赋值
结构体变量的传参#include#include#includestruct studen_t{
int sn;
char name[32];
};
void func1(struct studen_t stu)
{
printf("%d---%s\n", stu.sn, stu.name);
}
void func2(struct studen_t *pstu)
{
pstu->sn = 2;
strcpy(pstu->name, "小红");//结构体中字符串的赋值
}
int main()
{
struct studen_t stu = { 1, "小明" };
func1(stu);
func2(&stu);
//传递空间地址进入函数,不仅可以访问地址所指向的空间,还可以修改所指向空间的值
func1(stu);
system("pause");
return 0;
}
![](/upload/otherpic24/5afe268d4756a8ef439426631d943a00.jpg)
数组传参:
#include#include#includestruct studen_t{
int sn;
char name[32];
};
void func(struct studen_t *pstu)
{
pstu->sn = 21;
strcpy(pstu->name, "小红");//结构体中字符串的赋值
}
int main()
{
struct studen_t arry[3] = {
{ 1, "张三" },
{ 2, "李四" },
{ 3, "王五" }
};
func(arry);//arry是数组名,是数组首元素的地址,传递进入参数后,即修改数组首元素的值
for (int i = 0; i< 3; i++)
{
printf("学号:%2d 姓名:%s\n", arry[i].sn, arry[i].name);
}
system("pause");
return 0;
}
![](/upload/otherpic24/35d8381d6c3fd5255cbd2d55340d6e2f.jpg)
因为结构体类型占用空间较大,所以结构体传参时一般采用 传址操作(形参是地址,指针大小固定为4/8字节)。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章名称:C语言-结构体-创新互联
本文链接:http://myzitong.com/article/dsojpc.html