c++学习笔记之结构体、结构体数组和共用体、共用体数组

一、结构体
1、定义方式
使用关键词 struct
struct 自定义名
{
成员1类型 成员1;

};
如定义一个人的相关信息:
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
};
关于message的理解:可以将其看做一个自定义的类型,和int double等价看待。
既然message是一个类型,那么就可以定义变量(这里叫成员比较合适),在其他结构中就可以插入这种类型声明的成员。举个栗子:想在刚才的信息中插入这个人的性别,就可以这样干
struct sex1
{
char *sex;;
};
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
sex1 m ;//将定义的 sex(类型)结构插入进来
};
定义好结构部分后,就可以定义这种结构类型的变量了(有点绕?),有两种方式:
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
}worker1,worker2,*pp;
或者
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
};
message worker1,worker2,*p;
两种都是一样的效果,worker1就是message类型的变量,*p就是message类型的指针
在定义结构类型变量时,可以直接初始化,比如:
message worker1={“guankai”,17554420869,“henan_mianchi”,22}; 注意这个变量的初始化是有顺序的,与结构内的成员一一对应。
2、访问结构
对结构内定义的各个成员变量访问,可以实现赋值、读取。访问方式为:
结构变量名.成员
比如:message worker1; worker1.name; worker1.address; worker1.age;
举个栗子,实现对结构内成员赋值以及输出:

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <string.h>//strcpy()函数头文件
struct message
	{
		char phone[12];
		char *name;
		char *sex;
		char *address;
	};
void main()
{
/*	message kays={"17354420769","guankai","man","he_nan"};定义方式1,直接初始化*/
	message kays;
	kays.name="guankai";
	strcpy(kays.phone,"17354420769");//需要注意对于成员是数组类型,不能直接=,需要使用strcpy函数
	kays.sex="man";
	kays.address="he_nan";//定义方式2,对每个结构内成员进行赋值
	cout<<kays.phone<<endl;
	cout<<kays.name<<endl;
	cout<<kays.sex<<endl;
	cout<<kays.address<<endl;//逐个输出每个成员
}

输出结果:
在这里插入图片描述
这里需要注意的一点是,当结构内的成员类型为数组时,当是字符串时:如 char name[10];直接初始化是没有问题的,但是如果针对其进行赋值,必须采用strcpy()函数(如上述程序)。当是非字符串类型时,如:int a[3];那么进行赋值的时候,就需要采用:kays.a[0]=1; kays.a[1]=2; kays.a[2]=3;这样的形式来对每个元素单独赋值。
当定义的结构类型变量为数组时,要对每一个数组元素进行赋值,比如 message a[5],那么就需要对a[0]-a[5]分别赋值。举个栗子:

刚才讲的是直接访问结构,也可以通过指针来访问,访问形式为:
*(指针).成员 或者 指针->成员
如:
先作声明
struct message{…};
message kays;
message *pp=&kays;
那么
(*pp).name
或者
pp->name
举个栗子:

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <string.h>
struct message
{
	char phone[12];
	char *name;
	char *sex;
	char *address;
};
void main()
{
	message kays;
	message *pp;
	pp=&kays;
	strcpy((*pp).phone,"17354420769");
	pp->name="guankai";
	pp->sex="man";
	pp->address="he_nan";
	cout<<(*pp).name<<endl;
	cout<<(*pp).phone<<endl;
	cout<<pp->sex<<endl;
	cout<<pp->address<<endl;
}

在这个程序中,使用了两种方式,是完全等效的,注意使用(*pp).name时,括号把 * 也包括在内。
输出结果为:
在这里插入图片描述
在这个实例中,pp为指针,且为结构类型的指针,对于pp++来说,偏移一个结构的长度。结构内的各个成员类型不同,所以不能使用传统指针偏移类型方式访问,只能使用成员方式访问。
结构类型相同的两个变量可以整体赋值,如message a; message b; 对a进行初始化后,可以b=a来进行整体赋值,关系可以与 int a=5,b; b=a;的关系来对比。
这就不举栗子了,比较简单。
二、共用体
1、共用体就是特殊的结构体,对于结构体来说,里边每个变量的地址是不一样的;对于共用体来说,里边每个变量共用一片地址空间。
2、关键字修饰 union
3、以程序为例,定义一个共用体,输入0,输出年级 5(int),输入1,输出 “学工部”;

#include <iostream>
using namespace std;
union parter //定义一个共用体
{
	char department[10];
	int grade;
};
void main()
{
	int a;
	cin>>a;
	parter b;
	if(a==0)
	{
		b.grade=3;
		cout<<b.grade;
	}
	if (a==1)
	{
		strcpy(b.department,"jidian");
		cout<<b.department;
	}
}

需要注意的是,共用体内的各个变量共用一个地址空间,因此一次只能对一个变量进行赋值,输出一个变量。

三、结构体数组
一个数组中的元素类型为结构体类型,则叫做结构体数组,以一个程序为例:输入n个学生的信息并输出:

#include <iostream>
using namespace std;
struct student //定义一个结构体,名字为student
{
	char name[20];
	int age;
};
void main()
{
	int n,i;
	student *message; //定义一个结构体指针message
	cout<<"INPUT THE AMOUNT OF STUDENT:";
	cin>>n;//输入要录入的学生个数n
	message=new student [n];//new student[n],系统动态分配n个student类型结构体的内存,返回的是地址;message为地址,这样指针就指向了动态分配的结构体数组地址
	for(i=0;i<n;i++)
	{
		cout<<"name: ";
		cin>>message[i].name;//结构体数组直接用message[i]的方式赋值、输出
		cout<<"age: ";
		cin>>message[i].age;
	}
	for(i=0;i<n;i++)
	{
		cout<<message[i].name<<"  "<<message[i].age<<endl;
	}
	delete []message;
}

这里需要注意的是,对于常规结构体指针变量赋值,用的是message->name,对于结构体数组则不同,直接用message[i].name
四、共用体数组与之相似,不再列出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值