1.给指针指定地址
a.
int *data; //int 类型变量
data = (int *)0x80000000
b.
txxx *data; //txxx结构体
data = (txxx *)0x80000000;
2.宏定义判断大小
a.
#define add(ptr) ptr = (ptr<MAX) ? ptr+1:0
注意这里不需要指定类型,也不需要指针
b.
如果是多语句,需要用\分隔
#define add(ptr) \
{ \
ptr++; \
if(ptr == MAX) \
ptr = 0; \
}
3.COMPILE_ASSERT
#define COMPILE_ASSERT(exp,str) extern char __ct_[(exp)?1:-1]
使用场景:
#define Parameter_Cnt 100
COMPILE_ASSERT((Parameter_Cnt!=100),"Parameter Cnt Error")
//在编译过程中编译器如果检查到Parameter_Cnt != 100(可能被后续的commit误修改),就会报错
4.结构体函数
typedef struct XXX
{
int a;
int b;
int (*add)(int c,int d);
int (*sub)(int c,int d);
}txxx;
int add(int a,int b)
{
xxx;
}
int sub(int a,int b)
{
xxx;
}
txxx test = {
.a = 1;
.b = 2;
.add = add;
.sub = sub;
};
5.设置字节对齐
①根本原因在于CPU访问数据的效率问题
②对于32位机器来说,4B对齐能够提高CPU访问速度
③一个变量,跨越了4B边界存储,那么CPU要读两次,效率低下
使用伪指令#program pack(n),C编译器将按照n个字节对齐
使用伪指令#program pack(),取消自定义字节对齐方式
__attribute(aligned(n)),让所作用的结构成员对齐在n字节自然边界上,如果有成员长度大于 n,则按照最大成员的长度来对齐
__attribute(packed),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐
#program pack(push)
#program pack(4)
struct xxx
#program pack(pop)
6.平方函数
#include <math.h>
int a = pow(4,2); //返回4的平方
7.次方函数
data = pow(10,0); //10的0次方
int ret = 1;
int a = data;
int b = n;
while(b)
{
if(b&1)
{
ret *= a;
}
b >>= 1;
a *= a;
}
8.等差数列求和
公差常用字母d表示,等差数列{an}的通项公式为:an = a1 + (n-1)d
前n项和公式为:Sn = n*a1 + n(n-1)d/2
或者 Sn = n(a1+an)/2
9.求两个数的平均值
mid = (L+R)/2 //这种写法有缺陷,如果L+R比较大,会溢出
mid = L + (R-L)/2
10.异或
相同为0,不同为1
可以理解为:无进位相加
满足交换律和结合律:a^b = b^a,a^b^c = a^(b^c)
n^0 = n, n^n = 0
交换两个数的值
a = a^b
b = a^b
a = a^b
*a和b在内存中不能是一块位置,如果是一块位置,会把这块内存clear为0
11.memset
按字节赋值
void *memset(void *str, int c, size_t n)
12.malloc( )&calloc( )
void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。
void *calloc(size_t nitems, size_t size) 分配所需的内存空间,并返回一个指向它的指针。
malloc 不会设置内存为零,而 calloc 会设置分配的内存为零,所以效率较低
13.逻辑取反&按位取反
!a //逻辑取反
~a //按位取反
Other:
1.>> <<优先级
①左移、右移优先级是最低的,比+-还要低
②一般有>> <<符号时,最好外面加层( )
2.qsort()
【从小到大排序】