C语言学习笔记之结构体

10.1C语言结构体

数组:存放相同数据类型
结构体:可以存放多种数据类型

结构体如何定义呢?
struct 结构体标签名{

结构体包含的成员变量或数组;
}结构体变量;

结构体是多种数据类型的集合,它可以包含多个变量和数组,这些数据可以是多种类型

#include<stdio.h>
int main() {
    
    
	struct student
	{
    
    
		char *name;//指针变量
		int num;
		int age;
		char group;
		float score;
	};//必须要有分号
}

注:结构体是一种程序员可以自己定义的数据类型。

基本数据类型:int float char
构造数据类型:struct

数据类型可以用来定义变量,变量是地址的助记符,我们常常用指针变量,因为指针更加灵活。

struct 结构体名 结构体变量
struct student stu1,stu2;
int a,b;

注:如果后面不需要用结构体名再定义结构体变量,那么就可以不写结构体名;但是结构体名、结构体变量名、结构体成员必须有两个。

一般情况下,结构体的各个成员在内存中是连续存储的。
但是在编译器的具体实现过程中,各个成员之间可能不是连续的,会存在缝隙。

注:C语言内存、C语言内存对齐可以提高寻址效率。

结构题成员变量的获取和赋值:

#include<stdio.h>

int main() {
    
    
	struct s
	{
    
    
		char *name;
		int num;
		int age;
		char group;
		float score;

	}s1;
	s1.name = "ybb";
	s1.num = 1912;
	s1.age = 18;
	s1.group = 'A';
	s1.score = 99.5;

	printf("%s\n%d\n%d\n%c\n%f\n",s1.name,s1.num,s1.age,s1.group,s1.score);
	return 0;
}

结构体成员访问运算符 .
数组成员访问运算符 []

结构体变量名.成员名;
student.name;

结构体成员的赋值可以利用结构成体成员访问运算符再赋值。

#include<stdio.h>

int main() {
    
    
	struct s
	{
    
    
		char *name;
		int num;
		int age;
		char group;
		float score;

	}s1 = {
    
     "ybb",1912,18,'A',99.5 };
	printf("%s\n%d\n%d\n%c\n%f\n",s1.name,s1.num,s1.age,s1.group,s1.score);
	return 0;
}

注:在定义时进行整体赋值,在使用过程中只能逐一赋值。

注:结构体是一种自定义的数据类型,作为创建变量的模版,本身不占用内存空间。而结构体变量本身因为包含了实际的数据所以需要内存空间来存储。

10.2C语言结构体数组

结构体数组:本质是一个数组,本来数组只能存储相同数据类型,但是结构体数组因为数组的每个成员是结构体,所以数组的每个元素是可以存放多种数据类型的结构体。

#include<stdio.h>

int main() {
    
    
	struct s
	{
    
    
		char *name;
		int num;
		int age;
		char group;
		float score;
	}s1[]={
    
     {
    
     "ybb0",1912,18,'A',99.5 } ,{
    
     "ybb1",1912,18,'A',99.5 },{
    
     "ybb2",1912,18,'A',99.5 } };
	printf("%s\n%d\n%d\n%c\n%f\n", s1[0].name, s1[0].num, s1[0].age, s1[0].group, s1[0].score);
	printf("%s\n%d\n%d\n%c\n%f\n", s1[1].name, s1[1].num, s1[1].age, s1[1].group, s1[1].score);
	return 0;
}

示例:

#include <stdio.h>
struct {
    
    
	char *name;  //姓名
	int num;  //学号
	int age;  //年龄
	char group;  //所在小组
	float score;  //成绩
}class[] = 
{
    
    
	{
    
    "Li ping", 5, 18, 'C', 145.0},
	{
    
    "Zhang ping", 4, 19, 'A', 130.5},
	{
    
    "He fang", 1, 18, 'A', 148.5},
	{
    
    "Cheng ling", 2, 17, 'F', 139.0},
	{
    
    "Wang ming", 3, 17, 'B', 144.5}
};
int main(){
    
    
	float sum=0;
	float avg;
	int cal=0;
	for (int i = 0; i < 5; i++)
	{
    
    
		sum = sum + class[i].score;
		if (class[i].score < 140)
		{
    
    
			cal += 1;
		}
	}
	avg = sum / 5;
	printf("%f\n", sum);
	printf("%f\n", avg);
	printf("%d\n",cal);
	return 0;
}

10.3结构体指针
结构体指针的本质是指针,只不过指针指向的位置是结构体。
结构体变量名和数组名不同,数组名在表达式中会被转换成数组指针,而结构体变量名不会。结构体变量名始终代表整个集合本身,去结构体变量的地址必须加&

定义结构体指针:

#include<stdio.h>

int main() {
    
    
	struct  stu{
    
    
		char *name;  //姓名
		int num;  //学号
		int age;  //年龄
		char group;  //所在小组
		float score;  //成绩
	}stu1={
    
    "Li ping", 5, 18, 'C', 145.0},*pstu=&stu1;

	struct stu *pstu = &stu1;

注:结构体和结构体变量需要区分
结构体是一种创建数据类型的模版不占内存,结构体变量是一种实实在在的占用内存的数据。

箭头运算符:通过结构体指针直接取得结构体成员变量
利用结构体指针访问结构体成员变量:

#include<stdio.h>

int main() {
    
    
	struct  stu {
    
    
		char *name;  //姓名
		int num;  //学号
		int age;  //年龄
		char group;  //所在小组
		float score;  //成绩
	}stu1 = {
    
     "Li ping", 5, 18, 'C', 145.0 }, *pstu = &stu1;
	printf("%s\n%d\n%d\n%c\n%f\n", (*pstu).name,(*pstu).num,(*pstu).age,(*pstu).group,(*pstu).score);
	printf("%s\n%d\n%d\n%c\n%f\n",pstu->name,pstu->num,pstu->age,pstu->group,pstu->score);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/BJTUYBYUAN/article/details/115407982