目录
数组
枚举类型
结构类型
联合类型
正文
一。数组:定义数组:注意点:数组对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,前者是来出一整个的,而后者是用来出一个字母的