C语言 第二十四节 结构体

C语言学习笔记 专栏收录该内容
25 篇文章 0 订阅

//一,什么是结构体
1,数组:一个整体由多个同类型数据构成。
结构体:允许一个整体由多个不同的数据类型构成。

//二,结构体定义
1,定义形式,内部元素称为成员
struct 结构体名{

	类型名1 成员名1;
	
	 类型名2 成员名2;
	 ,,,,,,
	 类型名n 成员名n;
};

2,举例
	eg:定义一个学生
	struct Student{
		char *name;
		int age;
		float height;
	}; 

//三,结构体变量的定义
1,先定义结构体类型,再定义变量
struct Student{
char *name;
int age;
};

	struct Student stu//定义了一个结构体变量,变量名为stu。
					  //struct和Student是连着使用的。
		

2,定义结构体类型的同时定义变量
	struct Student{
		char *name;
		int age;
	} stu;//结构体变量名为stu

3,直接定义结构体类型变量,省略类型名
	struct{
		char *name;
		int age;
	} stu;//结构体变量名为stu,

//四,结构体的注意点
1,不允许对结构体本身递归定义
struct Student{ //错
int age;
struct Student stu; //误
};

2,结构体内可以包含别的结构体
	struct Date{
		int year;
		int month;
		int day;
	}; 
	
	struct Student{
		char *name;
		struct Date birthday
	};

3,定义结构体类型不分配存储空间。
  定义属于结构体类型的变量时,
  系统才分配存储空间给变量 。
  struct Student{
  	char *name;
  	int age;
  }; 
  
  struct Student stu;//系统开始分配空间 

4,结构体变量占用内存空间=成员所占内存空间的和。
	struct Student{
		char *name;
		int age;
		float height;
	}; 

//五,结构体的初始化
按顺序,对应赋值
struct Student{
char *name;
int age;
};

struct Student stu = {"MJ",27
};
只能在定义变量的同时进行初始化赋值,
初始化赋值和变量的定义不能分开.

//六,结构体的使用
1,一般对结构体变量操作以成员为单位进行。
一般形式:结构体变量名.成员名
struct Student {
char *name;
int age;
};

	struct Student stu;
	
	stu.age = 27;//对结构体age成员进行赋值
				//“.”称为成员运算符,优先级最高。


2,如果某个成员也是结构体变量,
   可以连续使用成员运算符"."访问最低一级成员。
   struct Date{
   		int year;
   		int month;
   		int day;
   }; 
   
   struct Student {
   		char *name;
   		struct Date birthday;
   };
   
   struct Student stu;
   
   stu.birthday.year = 1986;
   stu.birthday.month = 9;
   stu.birthday.day = 10;

3,相同类型的结构体变量之间可以进行整体赋值
	struct Student{
		char *name;
		int age;
	}; 
	
	struct Student stu1 = {"MJ",27
	};
	
	struct Student stu2 = stu1//将stu1直接赋值给stu2 
	
	printf("age is %d",stu2.age)

//七,结构体数组
1,定义;跟结构体变量一样,结构体数组也有3种定义方式
struct Student {
char *name;
int age;
};
struct Student stu[5];//定义1

	struct Student {
		char *name;
		int age;
	} stu[5];//定义2 
	
	struct {
		char *name;
		int age;
	} stu[5];//定义3 
	
	上面3种方式,
	都是定义了一个变量名为stu的结构体数组,
	数组元素个数是5

2,初始化
	struct {
		char *name;
		int age;
	} stu[2]={{"MJ",27},{"JJ",30}}; 
	也可以用数组下标访问每一个结构体元素,
	跟普通数组的用法是一样的.

//八,结构体作为函数参数
传递的全是成员的值
也就是将实参中成员的值一一赋值给对应的形参成员。
因此,形参的改变不会影响到实参
#include <stdio.h>
//定义一个结构体
struct Student {
int age;
};

void test(struct Student stu){
	printf("修改前的形参,%d \n",stu.age);
	//修改实参中的age 
	stu.age = 10;
	printf("修改后的形参,%d \n",stu.age);
	
}

int main(int argc,const char *argv[]){
	//定义一个结构体变量stu 
	struct Student stu = {30
	};
	printf("修改前的实参:%d \n",stu.age);
	//调用test函数 
	test(stu);
	
	printf("修改后的实参:%d \n",stu.age);
	return 0;
}
形参改变,实参不变

//九,指向结构体的指针
1,使用原因:
每个结构体都有自己的存储空间和地址

2,结构体指针变量定义形式:
	struct 结构体名称 *指针变量名 

3, 三种访问结构体成员方式
	结构体变量名.成员名
	(*指针变量名).成员名
	指针变量名->成员名
	
	#include <stdio.h>
	
	int main(int argc,const char *argv[]){
		
		//定义一个结构体类型
		struct Student {
			char *name;
			int age;
		};
		
		//定义一个结构体变量 
		struct Student stu = {"MJ",27
		};
		
		//定义一个指向结构体的指针变量 
		struct Student *p;
		
		//指向结构体变量stu 
		P = &stu;
		//以下三种访问结构体成员方式
		//1,结构体变量名.成员名 
		printf("name=%s,age = %d \n",stu.name,stu.age);
		
		//2,(*指针变量名).成员名 
		printf("name=%s,age = %d \n",(*p).name,(*p).age);
		
		//3,指针变量名->成员名 
		printf("name=%s,age = %d \n",p->name,p->age);
		
		return 0;
	} 
  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值