C语言 结构体

发布于:2022-08-05 ⋅ 阅读:(335) ⋅ 点赞:(0)

结构体的定义

基本数据类型 (内置类型) 原来就有 如:int double char 等等
而结构体类型 —> 自定义类型

设计一个结构体类型

struct 类型名字
{
成员列表(属性)
};

设计一个学生类型:

struct Student {
int num = 0;
char name[10];//名字     成员列表:可以为各种类型,如int double 结构体
int age;//年龄
int score;//分数
} ;// 注意要以分号结尾

使用时:
类型(struct Student) + 变量名称 (stu)

struct Student stu ;

所占内存大小

类型设计时,不占内存 。

此时不占用内存
struct Student 
{

} ;// 注意要以分号结尾

但当使用数据类型来定义变量时就占用内存

struct Student {
int num = 0;
char name[10];//名字     成员列表:可以为各种类型,如int double 结构体
int age;//年龄
int score;//分数
} ;// 注意要以分号结尾

占内存大小:

char name[10]  占10个字节
int age  占4个字节
int score  占4个字节

共18个字节

对于name 还可以这样设计

struct Student {
const char* name;//存放张三所在的地址(位于数据区)
int age;//年龄
int score;//分数
};

在内存上为这样存在:

const char* name  占4字节
name放的为一个地址,为存放张三所在的地址(位于数据区)
共占12个字节

在使用和设计时,应优先选择所占字节更小的结构体。

用typedef来重命名

可以用typedef来重命名,这样在之后使用时可以直接用重命名。
可以用 Student 代替 struct Student 来定义结构体变量,更加方便。

//方式一
typedef struct Student Student;

//方式二
typedef struct Student 
{
    const char* name;
    int age;//年龄
    int score;//分数
}Student;//重用名

使用:

Student str ;//代替struct Student str;

指针类型结构体进行重命名

//方式一
typedef struct Student* PStu;

//方式二
typedef struct Student 
{
    const char* name;
    int age;//年龄
    int score;//分数
}Student,*PStu;//重用名

使用:

PStu pstr = &str;//struct Student* pstr = &str;

进行成员的访问

  1. 通过 . 访问
    stu.name;
    stu.age;
    stu.score;

  2. 结构体与指针结合
    Student* ptr = &s;//结构体变量指针 使之指向结构体变量s
    printf(“%s\n”,(*ptr).name);//1 通过.访问
    printf(“%s\n”,ptr->name);//2 通过指向符来访问

结构体的使用

定义结构体

struct Student {
const char* name;
int age;//年龄
int score;//分数
};

1.普通结构体

int main()//定义一个结构体变量 赋值 ,通过.访问 ,打印结构体的值
{
   struct Student stu = {"张三",10,100};//对结构体变量stu进行初始化(赋值)
   //可以通过结构体变量来进行成员的访问
   printf("%s\n",stu.name);


   return 0;
}

运行结果:
请添加图片描述

2.数组类型结构体

int main()
{
//定义一个结构体数组,赋值 ,通过.访问 ,打印结构体的值
  struct Student arr[] = {{"zs",10,100},{"ls",9,99},{"ww",11,90}};
  int len = sizeof(arr)/sizeof(arr[0]);
  for(int i = 0;i<len;i++)
  {
  printf("第%d个学生 名字:%s 年龄:%d 分数:%d\n",i,arr[i].name,arr[i].age,arr[i].score);
  }
  return 0;
}

运行结果:
请添加图片描述

练习题:对学生数组进行排序

  • 要求:
    按照学生成绩对学生数组进行冒泡排序(升序)
    若成绩相同,按姓名(降序排序)
  1. 定义结构体,并重命名为Student
typedef struct Student {
	const char* name;
	int age;//年龄
	int score;//分数
}Student;
  1. 通过冒泡排序来对成绩比大小,按照升序排序。排序完后再对其成绩相同的学生按照名字进行降序排序。
void BubbleSort(Student *s,int len)
{
	Student ss;
	for (int i = 0; i < len; i++)//对成绩进行升序排序
	{
		
		for (int j = 0; j < len - i -1; j++)
		{
			if (s[j].score > s[j+1].score) 
			{
				ss = s[j];
				s[j] = s[j + 1];
				s[j + 1] = ss;
			}
		}
		
	}
	for (int j = 0; j < len-1 ; j++)//对成绩相同者进行降序排序
	{
		if (s[j].score == s[j + 1].score)
		{
			if (strcmp(s[j].name, s[j + 1].name) >= 0) { break; }
			else
			{
				ss = s[j + 1];
				s[j + 1] = s[j];
				s[j] = ss;
			}
		}
	}		
}
  1. 测试看是否正确
int main()
{
	
	struct Student s[] = {{"zs",10,100},{"awls",9,99},{"wa",11,99}};
	int len = sizeof(s) / sizeof(s[0]);
	BubbleSort(s, len);
	for (int i = 0; i < len; i++)
	{
		printf("第%d个学生 名字:%s 年龄:%d 分数:%d\n", i,s[i].name, s[i].age, s[i].score);
	}
	return 0;
}

运行结果:
请添加图片描述


网站公告

今日签到

点亮在社区的每一天
去签到