C语言技术点使用

#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

解析:

~是位取反的意思。
_INTSIZEOF(n)整个做的事情就是将n的长度化为int长度的整数倍。
比如n为5,二进制就是101b,int长度为4,二进制为100b,那么n化为int长度的整数倍就应该为8。
~(sizeof(int) - 1) )就应该为~(4-1)=~(00000011b)=11111100b,这样任何数& ~(sizeof(int) - 1) )后最后两位肯定为0,就肯定是4的整数倍了。

(sizeof(n) + sizeof(int) - 1)就是将大于4m但小于等于4(m+1)的数提高到大于等于4(m+1)但小于4(m+2),这样再& ~(sizeof(int) - 1) )后就正好将原长度补齐到4的倍数了。

 

取一个数(len)除以4后的余数

len & 3;

 

把一个整数转化成一个地址
比如,地址 0x12ff 里面存放的是数是5, 
然后定义了一个int   *p; 
想让p指向变量5, 
如何才能让p存放的地址是0x12ff? 

int *p=(int *)0x12ff;

 

break使用

在两层while(1)循环中,break只会跳出最里面那层while循环。

 

extern使用

extern 与函数

函数的声明和定义均可以不使用extern。

第一套方案(不使用头文件的方案)

A.C中定义一个函数fun():
int fun(void) //定义

{

return 0;

}

 

B.c中调用fun():

Int fun(void);//先声明

Int main()

{

Fun();//调用

}

或者可以有第二套方案(使用头文件的方案)

假设第一套方案中有B.c,C.c,D.c都要调用A.c中的fun(),总不能在每个.B~D.c文件中都声明一下吧,所以我们把这个声明写在头文件里,例如

A.h

Int fun(void);//声明

然后B~D.c中包含这个头文件,然后就可以调用了。

 

extern 与变量

//B.c调用A中的全局变量Num

A.c中

int Num=0;//定义Num,这里写成

extern int Num=0;也可以,写成

int Num;也可以,都是定义。

唯独不能写成 extern int Num;因为这是声明。

A.h中

extern int Num;//声明Num

B.c中

#include "A.h"

Num=1;//对Num进行操作

注:其实关注点不应该是extern,而应该是变量的声明与定义。定义一定要有,且只有一次,而声明可以多次,变量声明并非一定要头文件中,只是因为在头文件中可以被多个源文件包含(其实就是变相的多个源文件都声明这个变量)。

如果上述变量不使用头文件,则可以选择与上述的函数第二个方案一样,直接在要调用该变量的源文件中,即B.c中声明一下,即extern int Num;然后使用。

 

 

static使用

static在函数的声明与定义中,都需要注意,这个函数不能用在外部,不然会报错,其他的文件没有对这个函数的定义。

 

sprintf使用技巧(使用%.5s指定字符串长度为5,不管name长度有多少)

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char cmd[100];
	char name[]="testforsprintf";
	sprintf(cmd,"C:\\Users\\sunny\\Desktop\\%.5s.txt",name);
	printf("cmd is %s\n",cmd);
	
	FILE *file_t = fopen(cmd,"wb");
	fwrite(name,1,sizeof(name),file_t);
	fclose(file_t);
}

打印的结果:cmd is C:\Users\sunny\Desktop\testf.txt

生成的文件testf.txt打开后

testforsprintf 

注意:testforsprintf后有一个空格。

 

将两个有序数组组合成一个有序数组。

例:将两个从小到大排序的数组col1和col2组合成一个从小到大的数组dest。

void mergeKernelColumns (const float *col1, const float *col2, unsigned int num1, unsigned int num2, float *dest)
{
	unsigned int min_num = 0;

	if(num1 <= num2)
	{
		min_num = num1;
	}
	else
	{
		min_num = num2;
	}

    unsigned i = 0, j = 0;
    while (i < min_num && j < min_num)
    {
        *dest = col1[i] < col2[j] ? col1[i++] : col2[j++];
        dest++;
    }

    for (; i < min_num; ++i, ++dest)
    {
        *dest = col1[i];
    }

    for (; j < min_num; ++j, ++dest)
    {
        *dest = col2[j];
    }
}

 

NEON指令,哈希算法

https://www.jianshu.com/p/253a1cb1d3cf

https://www.jianshu.com/p/2593d1722ce9

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值