(六十)类型组合

简介:

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

上代码:

#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]

 

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

指针名  是指针数组

指针名[编号]  是指针

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

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

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

 

⑦几个变化:

结构名.变量名

(*指针名).变量名

指针名->变量名

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

 

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

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

 


目录
相关文章
|
6月前
|
编译器 程序员 C语言
【C++ 类型系统】了解C++ 中 标量、复合、标准布局、平凡和聚合类型
【C++ 类型系统】了解C++ 中 标量、复合、标准布局、平凡和聚合类型
209 0
|
6月前
7-7 念数字 (15 分)(用数组简化判断过程)
7-7 念数字 (15 分)(用数组简化判断过程)
45 0
|
6月前
|
算法
算法编程(二十九):统计一致字符串的数目
算法编程(二十九):统计一致字符串的数目
79 0
|
11月前
|
移动开发 人工智能
马尔可夫链预测举例——钢琴销售的存贮策略
马尔可夫链预测举例——钢琴销售的存贮策略
157 0
|
11月前
|
人工智能
实例解释在lingo中使用集合模型
实例解释在lingo中使用集合模型
173 0
|
算法 安全 机器人
算法提高:计算几何基础 | 判断包含关系
计算几何是计算机科学的一个重要分支,主要研究几何形体的数学描述和计算机描述,在现代工程和数学领域,以及计算机辅助设计、地理信息系统、图形学、机器人技术、超大规模集成电路设计和统计等诸多领域都有重要的用途。在 ACM 竞赛中,出题相对独立,曾出现过与图论、动态规划相结合的题,大多数计算几何问题用程序实现都比较复杂。常用算法包括经典的凸包求解、离散化及扫描线算法、旋转卡壳、半平面交等。本文介绍计算几何常用算法——包含关系。
159 0
|
编解码
失真的概念和定义
失真的概念和定义
221 0
|
测试技术
参数与非参数检验:理解差异并正确使用
数据科学是一个快速发展的领域,它在很大程度上依赖于统计技术来分析和理解复杂的数据集。这个过程的一个关键部分是假设检验,它有助于确定从样本中获得的结果是否可以推广到总体。
314 0
|
算法 C++
<<算法很美>>——(四)——深入递归<二>——“逐步生成结果“类问题之非数值型
<<算法很美>>——(四)——深入递归<二>——“逐步生成结果“类问题之非数值型
<<算法很美>>——(四)——深入递归<二>——“逐步生成结果“类问题之非数值型
|
数据采集 消息中间件 存储
数据预处理-航线类型操作类型目标与思路|学习笔记
快速学习数据预处理-航线类型操作类型目标与思路
127 0
数据预处理-航线类型操作类型目标与思路|学习笔记