C++的学习笔记(第四章:数组及自定义类型)

本文详细介绍了C++中的数组、枚举类型、结构类型和联合类型,并提供了丰富的实例和注意事项,帮助读者深入理解这些核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

数组

枚举类型

结构类型

联合类型


正文

一。数组:定义数组:注意点:数组对sizeof的使用;还有对传递后的数组的使用。

                                           注意区分数组和字符串。【主要有两点区别 1:字符数组的结尾必须搞个'\0'(ascall码值为0);2.数组可以实现定位这个功能】

           数组的初始化:a:初始化的未赋值的值的情况 b:数组的上限。

           字符数组的定义:A:注意字符串有两种表现方式:一是字符数组(又有两种情况,一是字符数组,二是数组指针),二是string类的使用。

                                       B: 字符数组的结尾必须以‘0/‘结尾,自定义分别赋值的话,必须要自己给值,如果想要从中间截断必须直接令它为0,如果是数组的话。直接令它为0就可以了,而如果想要在字符串中间的话,\0;如果想要在数组初始化的时候就搞定的话,那么就要记得在\0的后面打空格就好。

           多维数组:A:有一种给所有值为0的方法;

                             B.如果不给数组的数据的话,只能空第一个(想一下就知道为什么了)。

                             C.你猜猜多维数组是怎么存放在内存里面的...(是按顺序的啦,手动滑稽,对了给一个公式 N!+(N-1)!+··· 记住N是代表维度的)

           数组的赋值(A:遍历;

                                B:用”strcpy[已经被淘汰,换为strcpy_s 新的函数,是在中间加长度的(记住字符串长度+1的)](str1,st2或” “){上式为函数语法}或者strncpy函数【加一个N)

           数组的输出(遍历)对了,只有字符的数组名输出是直接输出数组内的元素(string都不可以)


二。枚举类型:(枚举类型的处理的目的是为了将某些有范围的数给一个范围)

枚举类型的定义:enum weekday{  }依次往里输代表就好,记得数据的连接是需要依靠上一个数的。

枚举类型的赋值:day=mon/(weekday)0[后一个是因为weekday现在就相当于int一样]


三。结构类型   (结构类型是用来将不同类型的数据存放为一个整体,而且它和类不一样,比类低级一点,只能储存数据,我们可以看到对象化处理的影子,或许说,类就是在结构类型和函数的基础上诞生的,对象化的思路更有利于处理)

结构类型的定义

结构类型的初始化

结构类型的使用

结构数组的使用(新的技能,目测这个玩意可以定义相同类型的N多的东西)

                            讲一下这个玩意的语法吧


四。联合类型(可以用来省内存?炫技?{貌似乱入了什么东西}避免重用?)

这个玩意吧,貌似很有用处,不过目前没有体会到,完了在补好处

联合类型的定义  有一种调用叫做无名调用

联合类型的调用

联合类型的特点 :a:只能调用其中之一

                              b:成员的内存是最大的那一个

                              c:不能对联合变量名赋值和初始化,也不能做函数的参数和返回值

说一下语法吧:union

{

}


应用

A:字符串或者数组长度的总结

sizeof对数组的求法:记得是求所占的实际空间(既总空间,算上了0,而且没排满都要算)。而且还有一个数组退化为指针的注意点,记住有时候(逐个赋值,结尾不给0时不会)会+'\0';

         对string字符串的求法:(从网上摘取)不同的字符所占的字节是不同的。
  ASCII码:
  一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如一个ASCII码就是一个字节。
  UTF-8编码:
  一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
  Unicode编码:
  一个英文等于两个字节,一个中文(含繁体)等于两个字节。
  符号:
  英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。

         对结构类型的处理:结构类型的内存必须是4的整数倍,所以必须补4字节

         对联合类型的处理:联合类型的最大值

         对枚举类型的求法:按照int型的去算

strlen 求的是实际的长度,所以遇到0就会结尾,而且不算0,但手动添加的话就会算0,而且一定要算到0结束的那一位;

str.length 可以求字符串的长度,不带0


对数组的空间的预留一定要够,你要明白预留的空间是必须的,而“”是自动添加的,‘’是手动添加的。




B:冒泡排序(这个玩意可以用来排序的,是拥有好几个版本的经典之作,基本的原理是顺序交换,多次排序)

冒泡排序的基础版本

遍历所有的元素,实现每个元素之间的交换,这是内层,外层是多次调用内层,调用次数是N-1次

冒泡排序的更新版本

a:每次比较的范围可以缩小,每次减一

b:每次比较可以加一个判断,如果交换的次数为0,则停止循环。

C.大小写的搞定方法

 1:可以用ascall码来搞定

 2:可以用库函数 tolower,或者说是toupper来搞定


补充:对数组的补充:A:如果一个指针后面加上数组的方括号,那么这个指针的含义就变成了数组(其实我们可以从原理上来看一下这件事情,因为数组名的本质也是地址,而指针的内容也是地址,那么这两者应该是贯通的关系所以可以这么执行);

                                    B:如果对于一个多维的数组,只引用它的高维的数组维度的话,那么去找这个高维里面的第一个元素,就是这个地址所代表的元素。

C:i/ofile.close();括号很重要。

D。ofile 是删除了文本里原有的,或者新建一个文档。

E。数组的地址的偏移方式

1.&a[i]+b;

2.a+b;

F.联合类型的时候可以用  int c;( mon==c)来判断两个东西是否相等。

G.对于数组名还可以用来搞地址,而结构体搞出来的名字不能搞地址,枚举类型搞出来的名字也不能搞地址。但是枚举类型可以直接的输出。

H.getline的讲解 getline(char*pch,int N,char)这个东西可以用来从一堆输入的字符中搞定读取信息。

I.对数组进行赋值的本质是有两种:第一张是进行每一个值的赋予(使用循环);第二种是进行内存地址的赋予(如strcpy_s,或者memcpy【(目标,原来的,字节数)】);

  对结构类型进行赋值的方法也是有两种,可以一个一个去给值,也可以让两个相同类型的去赋值(但是数组不可以,因为数组的名称代表的是地址)。

    对枚举类型的赋值也有两种,一是直接用化名来赋值;二是用强制类型转换。

J.

而且我们来对这个与地址有关的大boss来个终极的介绍:

对一维的数组:我们需要鉴别一下地址加1和值加1这两个东西,地址加一就是挪到下一个了,而值加一显然就是加1。

而不巧,对高维的数组有

	int a[3][3] = { 1,2,3,4 ,5,6 ,7,8,9};
	cout << *a << endl;
	cout << a << endl;//我们可以看到对前两个的输出内容是一样的,因为输出的是首地址
	cout << a + 1<<endl;//而第三和四句来说,可以说是一个飞跃(因为会乘以一维数组维度),因为有三保底可乘
	cout << a + 1 * 2 + 1 << endl;//
	cout << a[0] + 1 * 2 + 1<<endl;
	cout << a[0] + (0 * 2 + 1) << endl;//这两个就不会有飞跃了
	cout << &a[0][0]<<endl;//emmm这个和上两个的效果相当
0133F8C0
0133F8C0
0133F8CC
0133F8E4
0133F8CC
0133F8C4
0133F8C0

 

mdzz再说一下,当地址传递的时候,我们可以传递的是一维数组的名字,和对一维数组的第一个元素取地址的操作;

而对待高维数组的话,我们可以传的是高维数组取一回指针后的结果(但是不可以传数组的名字),也可以传的是&a[0][0];

而形参的话可以选择*p,或者是p[ ](数组指针稍后回来)

哈哈哈,数组指针回来了:emmm

字符数组指针:char as[ ]={"","",""}可以写as[1],as[2],as[3]

数组指针的一维情况:没啥要说的

数组指针的二维情况:在定义的时候,必须指出的是一维数组的大小,例如:char a[3][4],(*p)[4];

然后重点来了:*(*(p+行)+列)


再补充一个有趣而又麻烦的事情,就是,char *p[4] 这个东西的使用,p[1] 或者说是*p,前者是来出一整个的,而后者是用来出一个字母的

 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值