(六十)类型组合

之前学到了指针,数组,指针数组,结构等。他们之间可以互相结合使用,原则同正常使用。

上代码:

#include<iostream>

struct aa	//定义结构
{
	int a;
};

struct aaa	//定义结构aaa
{
	int b;
	int c;
};

int main()
{
	using namespace std;
	aa s1, s2, s3, s4, s5;	//使用定义aa 的结构s1,s2,s3,s4,s5
	s1.a = 1;	//s1结构的变量值为1
	cout << s1.a << endl << endl;	//输出s1结构的变量值
	
	//以下是指针
	cout << "以下是指针" << endl;
	
	aa *b = &s2;	//指针b指向结构s2的地址
	(*b).a = 5;	//使用(*指针名).变量名 形式,为其赋值
	cout << s2.a << endl << endl;	//输出结构s2的变量的值
	aa *c = &s3;	//指针c指向结构s3地址
	c->a = 10;	//使用箭头运算符-> 指针名->变量名 形式为指针指向的结构变量赋值
	cout << s3.a << endl << endl;	//输出结构s3变量的值
	
	//以下是数组
	cout << "以下是数组" << endl;

	aa bb[3];	//创建结构数组,数组元素为3
	bb[0].a = 3;	//数组第一个元素的变量a值为3
	//bb是数组,bb[0]是数组第一个成员,bb[0].a是数组bb中第一个成员的int a变量
	cout << bb[0].a << endl << endl;	//输出数组bb第一个成员的变量a
	(bb + 1)->a = 6;	//数组 或 字符串名 实际上就是指针名,注意数组名是bb,bb相当于上面的指针b。因此指针使用b->a时,数组这边是bb->a;
	//又因为bb实际上等同于bb[0],因此bb+1就等同于bb[1],而bb+2等同于bb[2]。因此(bb+1)->a相当于bb[1].a
	cout << bb[1].a << endl << endl;

	//以下是指针数组
	cout << "以下是指针数组" << endl;
	aa *cc[2] = { &s4,&s5 };	//创建指针数组cc,成员为2个
	//因为是指针,所以想要操作指针所指向地址的值的话,就必须给指针初始化(即&s4,&s5},不然就无法操作
	cc[0]->a = 2;	//cc是指针数组,cc[0]是指针,因为是指针,所以可以用 指针->变量名 这是指针遇见结构可以使用箭头运算符
	cout << cc[0]->a << endl;
	(*cc[1]).a = 4;	//cc[1]也是指针,于是使用  (*指针名).变量名 这种形式来为结构的变量赋值
	cout << cc[1]->a << endl << endl;

	//以下是指针涉及到多个变量的结构
	cout << "以下是指针涉及到多个变量的结构" << endl;
	aaa a1, a2;	//先创建使用aaa结构的 结构a1和a2
	aaa *dd[2] = { &a1,&a2 };	//创建指针数组dd,分别指向a1和a2
	*dd[0] = { 11,22 };	//dd是指针,dd[0]是指针dd第一个成员(但,是地址),*dd[0]是第一个成员的值,可以充当结构名
	//当初始化结构的时候,我们使用 结构名={ };这种形式进行初始化
	//因此*dd[0]相当于 a1,于是初始化,两个变量分别为11和22
	cout << dd[0]->b << endl;	//输出指针第一个变量b
	cout << (*dd[0]).c << endl << endl;	//输出结构第二个变量c

	//以下是指向指针数组的指针
	cout << "以下是指向指针数组的指针" << endl;
	aa **e = cc;	//cc是数组指针,数组又是指针,单数组的话,要用*e,但又是指针,所以是**e
	cout << e << endl;	//因为e是指向指针数组的指针,因此地址是相同的,都是指向指针数组的第一个元素的地址
	cout << cc << endl;
	auto f = cc;	//auto创建自动符合类型的f
	cout << f << endl;	//f输出的是地址,说明f是指针

	system("pause");
	return 0;
}

①给结构中某个变量赋值:

结构名.变量名={}

给结构中某个变量赋值

 

②当指针遇见结构:

(*指针名).变量名= 

可以给结构中某个变量赋值。

指针名->变量名=

也可以给结构中某个变量赋值。

这个时候,(*指针名)充当的就是结构名的角色。

 

③结构数组:

数组名[编号].变量名=

通过这种形式给数组结构的成员的结构变量赋值。

数组名[编号]充当的就是结构名的角色,

注意:(1)编号为0的是第一个元素,以此类推。

(2)数组名 实际上是地址

 

④当指针数组遇见结构的时候,需要给指针数组赋值

比如aa *cc[2] = { &s4,&s5 }

s4是结构,cc是指针数组,cc[0]是第一个指针,那么要将结构赋值给指针,就需要给结构名前加&表示地址,

于是上面那行代码就相当于cc[0]=&s4;cc[1]=&s5;

 

⑤当指针指向指针数组时:

指针数组中的每个成员,是指针,指向相应的内存地址,比如cc数组中的2个指针,分别指向&s4和&s5。

数组名,实际上是数组的地址;

因此,指针数组名,实际上是储存着2个指针的数组地址,而非这2个指向的数组地址。

也就是说:

cc[0]指向&s4,

&cc[0]指向储存cc[0]这个指针的 内存地址,

cc是储存cc[0]和cc[1]这个指针的内存地址,又是这个数组中第一元素的内存地址,也就是&cc[0];

而一个指针指向这个指针数组时,指向的是储存这个指针数组的内存,而非这个指针数组的指针分别指向的内存地址,即:

e指向的是cc,也是&cc[0]

 

⑥指针名数组遇见结构时的各种变化:

指针名  是指针数组

指针名[编号]  是指针

*指针名[编号]  是指针的值,可以充当结构名,然后比如说用在:

(*指针名)[编号].变量名={} 

可以给相应的结构赋值,但前提是,指针已经被初始化。

 

⑦几个变化:

结构名.变量名

(*指针名).变量名

指针名->变量名

(*指针名)[编号].变量名

 

以上几个都是等价的,都是 结构中某个变量 ,但唯一需要注意的是,

使用指针的话,必须进行初始化,未初始化的是不安全的,也是不正确的。

 


你可能感兴趣的:(类型组合)