一、关键字
1.Register
存在寄存器里面,即cpu,该值不能取地址操作,并且是整数,不能是浮点数
2.Static (c语言:变量、函数 C++:类中变量、类中静态成员函数)
(1)定义变量
静态全局变量 ----> 作用域只能作用域本文件,每次函数调用该变量都会被初始化
静态局部变量-----> 生命周期不会随函数结束结束,直到程序结束,但是在函数外面不能使用该变量,只能在函数中使用,该变量是有记忆的,会记住上次的值,。该变量只被初始化一次
对于这两种变量来说,如果初始化的会在数据段内,未初始化的在.bss段或者初始化为0,这两种变量都会在程序结束才会释放,只不过作用域不同,静态局部变量只限定于函数中,但是该函数结束,该变量并没有被干掉,静态全局变量限定于本文件中
没有使用 static 变量:
可以看出打印的都是11,说明每次函数结束变量a就结束生命周期,这就是局部变量
有使用 static 变量:
可以看出static修饰的局部变量是不会随函数结束而结束,是保留记忆的,但是该变量只能在该函数中使用,虽然它存在,但是别人不能使用,因为他毕竟是局部变量,限定了作用域
静态局部变量和静态全局变量的区别:静态全局变量和全局变量差不多,可以被初始化,也有记忆,但是却被限定了只能在本文件中
(2)定义函数
在函数返回类型前加上static关键字,函数即被定义为静态函数。静态函数只能在本源文件中使用;也就是说在其他源文件中可以定义和自己名字一样的函数(即函数加Static 限制了函数只能在本文件使用)
(3)定义类中的静态成员变量(不能在类里面初始化,不占类内存空间,必须定义才能使用)
在类中的静态成员变量它即可以被当做全局变量那样存储,但又被隐藏与类中,类中的静态成员变量拥有一块独立的储存空间,不会占用类中的空间,所有的对象都共享该静态成员,也就是说,只要有对象改变了这个值,那么其他对象就会受影响,该数据可以使用this,也可以类中其他函数访问
注意:静态数据成员不能在类中初始化,在类中只是声明,而不是定义,静态数据必须要定义之后才能使用,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化
(4)定义类内的静态成员函数(只能访问静态成员变量)
静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间
注意:静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针(划重点,面试题常考)。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问,即不能在静态函数里面使用this指针
3.Switch-case
注意:
1.switch里面不能是浮点数、double,可以是表达式,但是结果不能是浮点数或double
2.要注意 case语句后面是否有break,如果没有,就会从找到的case语句一直执行到停止
3.case不能是”shshj”,可以是‘s’因为字符最终也是整数,变量表达式也不行,反正这个东西必须是能确定的
4.Do-while
先do,再while判断是否符合while里面的条件
5.Sizeof
1).Sizeof()和strlen()的区别
首先sizeof是关键字,strlen是函数,sizeof用来计算占用内存大小,strlen是用来计算字符串的长度, 特别是对于需不需要包含\0问题:
Sizeof是需要给 '\0' 计算空间的,strlen是不需要,
sizeof是在编译的时候计算的,而strlen是在运行的时候计算
2).求指针大小
在32位机器下,对于sizeof(指针变量)都是4个字节,比如 Int *a; Sizeof(a);
引申:求引用大小 Sizeof(char &) //1 引用大小和数据类型有关
3).计算数组大小
sizeof 计算的是数组的大小,即数据类型 *[ ]
strlen 计算的是字符串的长度
int num[5]={1,2,3,4};
printf("%ld\n",sizeof(num)); //20
char str[10]={"hello"};
printf("%ld\n",strlen(str)); //5
printf("%ld\n",sizeof(str)); //10
4)如何不使用sizeof求数据类型字节的大小
#define mysieof(value) (char*)(&value+1)-(char*)(&value)
5).strlen('\0') =? sizeof('\0')
printf("%d\n",sizeof( "\0" )); //2 因为这里有\0\0
printf("%d\n",strlen( "\0" )); //0
printf("%d\n",sizeof( '\0' )); //4
printf("%d\n",strlen( '\0' )); //报错
6).sizeof(a++)
int a = 2;
printf("%d\n",sizeof(a++)); // 4
printf("%d\n",a); // a = 2
注意:对于sizeof只会求所占内存大小,不会进行表达式运算
7).计算字符数组大小
char ch[] = "hello";
char str[10] = {'h','e','l','l','o'};
printf("%d\n",sizeof(ch));//6
printf("%d\n",strlen(ch));//5
printf("%d\n",sizeof(str));//10
printf("%d\n",strlen(str));//5
8).sizeof(void) 会出错或者为 1
6.New/malloc delete/free (指明大小,返回值,初始化)
1.首先new/delete是运算符,而malloc和free是函数
2.new先为对象申请内存空间,让后再调用构造函数进行初始化,同理delete可以调用析构函数释放内存,而 malloc只是申请内存空间并不能调用构造函数进行初始化,同理free也只是释放内存
3.malloc的返回值需要强转为自己申请的内存指针,而new不需要
4.malloc需要指定申请内存的内存大小
二、代码随想录
引入滑动串口
1. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。
那么滑动窗口如何用一个for循环来完成这个操作呢。
首先要思考 如果用一个for循环,那么应该表示 滑动窗口的起始位置,还是终止位置。如果只用一个for循环来表示 滑动窗口的起始位置,那么如何遍历剩下的终止位置?此时难免再次陷入 暴力解法的怪圈。所以 只用一个for循环,那么这个循环的索引,一定是表示 滑动窗口的终止位置。
那么问题来了, 滑动窗口的起始位置如何移动呢?
其实滑动窗口也可以理解为双指针法的一种!只不过这种解法更像是一个窗口的移动,所以叫做滑动窗口更适合一些。
- 窗口内是什么?
- 如何移动窗口的起始位置?
- 如何移动窗口的结束位置?
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针
相关题目推荐
904. 水果成篮 难度中等
模拟题:
模拟类的题目在数组中很常见,不涉及到什么算法,就是单纯的模拟,
59. 螺旋矩阵 II 难度 中等
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
54. 螺旋矩阵 难度中等
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
6. N 字形变换 难度 中等
总结
数组是存放在连续内存空间上的相同类型数据的集合。
数组可以方便的通过下标索引的方式获取到下标下对应的数据。
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
数组的元素是不能删的,只能覆盖。