一、const
它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。
const int a; // a 代表一个常整型数
int const a; // a 代表一个常整型数
const int *a; // a 代表一个指向常整型数的指针,即a的值是可变的,但是*a是不能变的,函数的一些形参经常会用到
int * const a; // a 代表一个常指针,即a的值是不可变的,但是*a是可变的
int const * a const; // a代表的是一个指向常整型数的常指针
二、排序
排序方式最常用的有:冒泡排序、直接插入排序、选择排序、快速排序、希尔排序,当然还有堆排序、归并排序等
这里我总结一下算法,实例在另一篇博文总结:
排序都以从小到大排序,数组长度为n:
(1) 冒泡排序
冒泡顾名思义就是要冒出来,相邻的两个元素进行比较,找到小的那个元素,让它冒出来,大的那个元素则沉下去,一直比较到最后将最大的那个元素放到第n个元素的位置;
然后继续上面步骤,找到第2个最大的数,放到n-1个元素的位置;
以此类推,一直到最后一个元素,当然最后一个元素肯定就是最小的,也是放到第1个元素所在的位置。
冒泡排序是稳定的,时间复杂度是n的平方(O(n2))。
(2)快速排序
快速排序是对冒泡排序的一种本质改进;它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位
置,而待排序序列的长度可能只减少1;
快速排序通过一趟扫描,就能确保某个数(基准值,通常我们选第一个)的左边各数都比它小,右边各数都比它大。然后又用同样的方法(递归)处理它左右两边的数,直到基
准点的左右只有一个元素为止;
最理想情况算法时间复杂度O(nlog2n),最坏O(n2)
(3) 选择排序
从第2个元素开始,分别与第一个元素比较,如果比第一个元素小,那么就交换,这样得到的第一个元素应该是最小的;
重复上一步,从第3个元素开始,分别与第2个元素比较,如果比第一个元素小,那么就交换,这样得到的第2个元素应该是最小的;
以此类推。
选择排序是不稳定的,时间复杂度是n的平方(O(n2))
(4) 直接插入排序
一般不明确前面顺序的话,就从第2个元素开始插入;
插入的时候,后面的元素就需要后移,所以,目前元素是j,那么就需要与j-1比较,如果比j-1小,就交换。也就是说插入到j-1的位置,原来j-1位置的元素就后移到j的位置;
重复上面步骤,一直到j元素的值不比j-1小;
然后再将j+1元素往直前j个元素里面插;
重复将j+2元素往里面插,一直到第n个元素。
直接插入排序也是稳定的,时间复杂度是n的平方(O(n2))
(5) 希尔排序
在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助。如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。
三、寄存器操作
- #define set_reg(addr,val) Wr(addr, val)
- #define get_reg(addr) Rd(addr)
- #define set_bits(addr,val,start,len) Wr(addr, (Rd(addr)&(~(((1L<<(len))-1)<<start)))|((val&((1L<<(len))-1))<<start))
- #define get_bits(addr,start,len) (Rd(addr)>>(start)) & ((1L<<(len))-1)
- #define set_bit(addr,val,index) set_bits(addr,val,start,1)
- #define get_bit(addr,index) get_bits(addr,index,1)
四、指针
1、指针,其实完全可以看做一个地址。
2、指针变量,说明这个指针是可变的,就相当于int a,a也是个变量,只不过a的值是个整型,而指针变量代表的是可变的地址。
定义的时候怎么表示指针?就用到了符号“*”,int *p;说明p是个指针变量,地址p里面放的是一个整型数。
3、指针变量使用跟普通变量一个,例如int a;a = 4;a只能赋值一个整型数。int *p;p = (int *)0x12345;或p = &a;
如果需要获取地址p所指的值,同样用到符号“*”。p = &a;那么*p就是a的值也就是4。
4、指针表示一维数组,a[i] 就是*(p+i)
5、指针表示二维数组,a[i][j]就是*(*(p+i) + j)
6、指针函数,即返回值是指针的函数。函数指针,即指向函数的指针