C的常用总结

一、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时,整个要排序的数被分成一组,排序完成。


三、寄存器操作

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #define set_reg(addr,val)                Wr(addr, val)  
  2. #define get_reg(addr)                    Rd(addr)  
  3. #define set_bits(addr,val,start,len)     Wr(addr, (Rd(addr)&(~(((1L<<(len))-1)<<start)))|((val&((1L<<(len))-1))<<start))  
  4. #define get_bits(addr,start,len)         (Rd(addr)>>(start)) & ((1L<<(len))-1)  
  5. #define set_bit(addr,val,index)          set_bits(addr,val,start,1)  
  6. #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、指针函数,即返回值是指针的函数。函数指针,即指向函数的指针


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值