C++ 笔记-结构体-枚举-类型定义

为什么要使用“结构”(结构体)

但需要表示一些复杂信息时,使用单纯的数据类型很不方便。
比如:学生信息(学号,姓名,班级,电话,年龄)

什么是“结构”
结构,就是程序员自定义的一种“数据类型”
是使用多个基本数据类型、或者其他结构,组合而成的一种新的“数据类型”。

结构的定义
struct 结构名 {
成员类型 成员名;
成员类型 成员名;
};
比如:
struct student {
char name[16];
int age;
char tel[12];
};

特别注意:
1)要以struct开头
2)最后要使用分号
3)各成员之间用分号隔开

结构体初始化三种方式

#include <iostream>
#include <windows.h>
#include <string>
#include <stdio.h>

struct jgt{
	int x;
	int y;
	int z;

};
struct student {
	char name[16];
	int  age;
	char tel[12];
};

using namespace std;
int main (void){
	//方式一 单独初始化每一个属性
	struct jgt s1,s2,s3;
	s1.x=1;
	s2.y=2;
	s3.z=3;
	//方式二 定义的时候初始化所有的属性
	struct student xiaohu = {"小胡", 17, "5201314"};

	//方式三  定义的时候我们可以指定初始化的属性 VS/VC不支持,但gcc 是支持的
	//struct student s1 ={.name="张三丰",.age = 100};

	cout<<s1.x<<s2.y<<s3.z<<endl;
	cout<<"小胡的名字是:"<<xiaohu.name<<endl<<"小胡的年龄是:"<<xiaohu.age<<endl<<"小胡的电话是:"<<xiaohu.tel<<endl;
	system("pause");
	return 0;
}

还有一种特别的,结构体包含结构体,这种可以用于统计一个班人员信息等

#include <iostream>
#include <windows.h>
#include <string>
#include <stdio.h>

struct jgt{
	int x;
	int y;
	int z;

};
struct student {
	char name[16];
	int  age;
	char tel[12];
};
//结构体包含结构体
struct _class{
	struct student  xiaohu;
	struct student  xiaohua;
};

using namespace std;
int main (void){
	//方式一 单独初始化每一个属性
	struct jgt s1,s2,s3;
	s1.x=1;
	s2.y=2;
	s3.z=3;
	//方式二 定义的时候初始化所有的属性
	struct student xiaohu = {"小胡", 17, "5201314"};

	//方式三  定义的时候我们可以指定初始化的属性 VS/VC不支持,但gcc 是支持的
	//struct student s1 ={.name="小胡",.age = 100};
	struct _class  c1={{"小胡", 17, "5201314"},{"小华",17,"13145520"}};
	cout<<"c1班小胡的信息是:年龄:"<<c1.xiaohu.name<<"年龄:"<<c1.xiaohu.age<<"电话是:"<<c1.xiaohu.tel<<endl;
	cout<<"c1班小华的信息是:年龄:"<<c1.xiaohua.name<<"年龄:"<<c1.xiaohua.age<<"电话是:"<<c1.xiaohua.tel<<endl;
	cout<<s1.x<<s2.y<<s3.z<<endl;
	cout<<"小胡的名字是:"<<xiaohu.name<<endl<<"小胡的年龄是:"<<xiaohu.age<<endl<<"小胡的电话是:"<<xiaohu.tel<<endl;
	system("pause");
	return 0;
}

结构体变量之间可以直接赋值
结构数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct student {
	char name[16];
	int  age;
};

int main(void){
	struct student s[2];

	printf("请输入第一个学生的姓名:\n");
	scanf_s("%s",s[0].name, sizeof(s[0].name));
	printf("请输入第一个学生的年龄:\n");
	scanf("%d", &s[0].age);

	printf("第一个学生的姓名: %s, 年龄: %d\n", s[0].name, s[0].age);

	//结构体的小秘密,结构体变量之间可以直接赋值
	s[1] = s[0];
	memcpy(&s[1],&s[0], sizeof(struct student));
	printf("第二个学生的姓名: %s, 年龄: %d\n", s[1].name, s[1].age);
	
	system("pause");
	return 0;
}

指向结构体的指针
使用结构体变量址指针访问结构体成员要使用 -> 符号

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct _friend{
	char name[32];
	char sex; // m - 男  f - 女
	int  age;
};

int main(void){
	struct _friend girl = {"小龙女", 'f', 18};

	struct _friend *my_girl = &girl;

	printf("小龙女的名字:%s, 性别:%s  年龄:%d\n", girl.name, girl.sex=='m'?"男":"女", girl.age);

	//指针访问结构体变量的成员,有两种方式
	//方式1. 直接解引
	printf("小龙女的名字:%s, 性别:%s  年龄:%d\n", (*my_girl).name, (*my_girl).sex=='m'?"男":"女", (*my_girl).age);

	//方式2. 直接使用指针访问  ->
	printf("小龙女的名字:%s, 性别:%s  年龄:%d\n", my_girl->name, my_girl->sex=='m'?"男":"女", my_girl->age);
	system("pause");
	return 0;
}

实际开发中我们常用 -> 符通过指针去访问结构体指针变量的成员

使用结构体传递值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct programer{
	char  name[32];
	int   age;
	int   salary; 
};

//形参是结构体变量,值传递
struct programer add_salary(struct programer p, int num){
	p.salary += num;
	return p;
}

//形参使用结构体指针
void add_salary1(struct programer *p, int num){
	if(!p) return ;
	p->salary += num;
}

//形参使用引用
void add_salary2(struct programer &p, int num){
	
	p.salary += num;
}

//形参是结构体变量,值传递,返回引用
struct programer& add_salary3(struct programer p, int num){
	p.salary += num;
	return p;
}

int main(void){
	struct programer xiaoniu;

	strcpy(xiaoniu.name, "小牛");
	xiaoniu.age = 28;
	xiaoniu.salary = 20000;

	//结构体变量做为参数传值是值传递,和int 等基本类型一样
	 //xiaoniu = add_salary(xiaoniu, 5000);

	//指针传值
	//add_salary1(&xiaoniu, 5000);

	//引用传值
	//add_salary2(xiaoniu, 10000);

	 //返回引用
	 xiaoniu = add_salary3(xiaoniu, 20000);

	printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age, xiaoniu.salary);

	system("pause");
	return 0;
}

注意:
一般不建议把结构体直接作为函数参数。
因为结构体的size比较大,直接传递,消耗性能!
解决方案:(使用指针和引用,优先使用引用)

枚举

枚举的概念
枚举是C/C++语言中的一种基本数据类型,它可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。
比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天、夏天、秋天、冬天。

枚举类型的定义

一般形式为:enum 枚举名 {枚举元素1,枚举元素2,……};
比如: enum Season {spring, summer, autumn, winter};
枚举变量的定义
前面只是定义了枚举类型,接下来就可以利用定义好的枚举类型定义变量,跟结构体一样,有3种方式定义枚举变量
1.先定义枚举类型,再定义枚举变量
enum Season {
spring,
summer,
autumn,
winter
};
enum Season s;

2.定义枚举类型的同时定义枚举变量
enum Season {
spring,
summer,
autumn,
winter
} s;

3.省略枚举名称,直接定义枚举变量
enum {
spring,
summer,
autumn,
winter
} s;
上面三种方式定义的都是枚举变量s

枚举使用的注意
C语言编译器会将枚举元素(spring、summer等)作为整型常量处理,称为枚举常量。

枚举元素的值取决于定义时各枚举元素排列的先后顺序。默认情况下,第一个枚举元素的值为0,第二个为1,依次顺序加1。

#include <stdio.h> 
  
int main()
 {
    // 1.定义枚举类型
    enum Season 
    {          
spring, 
        summer,
        autumn,
        winter
     };          

// 2.定义枚举变量
    enum Season s =  winter;
    printf("%d\n", s);
    return 0;
 }

打印结果为:3
也就是说spring的值为0,summer的值为1,autumn的值为2,winter的值为3

也可以在定义枚举类型时改变枚举元素的值

#include <stdio.h>    

int main()  {
     // 1.定义枚举类型 
     enum Season{
spring = 1, 
summer,
autumn,
Winter};

//2.定义枚举变量
enum Season s =  winter;
printf("%d\n", s);
return 0;
 }

打印结果为:4
没有指定值的枚举元素,其值为前一元素加1。

类型定义

为什么要使用类型定义
1.简化写法
2.提高程序的可移植性

//64 位linux 系统
#include <stdio.h>
#include <stdlib.h>

typedef   long  int64;

int main(void){

    int64 dream = 10000000000; //梦想一百亿
    printf("dream: %lld\n", dream);
    printf("sizeof(int64): %d\n", sizeof(int64));
    return 0;
}

打印结果

dream: 10000000000
sizeof(int64): 8字节

//32 window  系统
#include <stdio.h>
#include <stdlib.h>

typedef long long  int64;


int main(void){

    int64 dream = 10000000000; //梦想一百亿
    printf("dream: %lld\n", dream);
	 printf("sizeof(int64): %d\n", sizeof(int64));
	system("pause");
    return 0;
}

打印结果
dream: 10000000000
sizeof(int64): 8字节

类型定义的使用

#include <stdio.h>
#include <stdlib.h>

typedef char * STRING;
#define  STR   char *

int main(void){
	STRING s1, s2;  //等同于 char *s1; char *s2;
	char name[] = "Martin";
	s1 =  name;
	s2 = name;

	STR  s3, s4; //  char *  s3, s4;
	s3 = name;
	s4 = name[0];

	system("pause");
    return 0;
}

类型定义和宏定义有相似之处,但不能混为一谈

创作不宜请点赞(嘿嘿)

猜你喜欢

转载自blog.csdn.net/qq_35803412/article/details/105099558