C语言学习---小知识点总结

1.将一个16位的变量存放在两个8位的变量中。

buf[0] = (UINT8)(Bat_Information.BatType >> 8);
buf[1] = (UINT8)(Bat_Information.BatType & 0X00ff);

其中,Bat_Information.BatType位16位,buf[1]为8位。前面的强制转换也可以省略。

反过来类似。

Bat_Information.BatType = (((UINT16)buf[1]<<8) | buf[0]))

2.在对全部数组元素赋初值时,可以不指定数组长度。

eg;inta[]={1,2,3,4,5};

但如果当输出第a[5]以上的元素时,系统回输出随机数值,所以使用此方法时,不能使用超过初始值元素以上的元素。

3.用或运算,可使某位置为1,其它位不变.

eg: PINSEL0 |= 0x00000005; //设置串口引脚

使第0位和第二位置一,其他位不变。

同样的,与运算的话,是让某几位位置为0,其他位不变。

eg:

(Bat_Information.BatType & 0X00ff);

3.函数指针

C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针。

调用函数实际上等同于“调用指令+参数传递处理+回归位置入栈”,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器。

因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以“调用一个根本就不存在在函数实体。

4.共用体.

共用体把几种不同数据类型的变量存放在同一块内存里。公用体中的变量共享同一块内存。

定义公用体类型变量的一般形式为:

union 共用体名

{

成员列表;

}变量列表;

在共用体中同一块内存可以用来存放几种不同类型的数据,但在某一时刻只能在其中存放一个成员变量。共用体变量中起作用的成员是最后一次存入的数据。

#include <stdio.h>

union data
{
int i;
char c;
double d;
};
union data a;

void main(void)
{
	a.i = 50;
	a.c = 10;
	printf("%d\n %d\n",a.i,a.c);
	
	return;
}

最后输出的是两个10;

即共用体变量a中的成员i已经没有值了,因为存储该值的内存现在已经被用来存储成员c的值了。

 

共用体变量的长度取决于其成员的最大长度。

结构体变量所占内存的长度是各个成员的总和,每个成员分别占有自己的存储空间。共用体变量所占内存的长度是其最长成员的长度。当然,编译器出于提高访问效率的目的,在编译分配存储空间时往往要进行对齐操作。

5.CPU字长与存储器位宽不一致处理。

例如:使用共用体来解决这一冲突:

union send_temp{

uint16 words;

uint8 bytes[2];

}send_buff;

eg:send_buff.bytes[0]=a;//此处a 是8位

send_buff.bytes[1]=b;//此处 b 是8位;

此时就将8位字拼成了16位字存储了。

发送时send(send_buff.words)就可以每次发送一个16位的数据了。

这个在项目工程里也有很多地方用到。

eg:

lcd_digit.val = TOUMode.words[i-1];//TimeOfUse[ptrToU].words[i-1];

6.宏定义取两个,四个之间的最小值最大值。

这个简单,只是做一下记录。

#define min(a,b,c,d)  (a<b?a:b)<(c<d?c:d)?(a<b?a:b):(c<d?c:d) 

 

#define max(a,b,c,d)  (a>b?a:b)>(c>d?c:d)?(a>b?a:b):(c>d?c:d) 
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))

7.小代码块

下面两个小代码块,一个for循环是利用cnt来记录4页中哪几页使能了,使能了的位就置1;

下面的while代码块是计算出使能的页数。

for(i = 0; i < PAGE_OF_USE_MAX; i++)
{
	if(PageofUse[i].bit.enable)
	{  
		if (i==0)       cnt |= 0x01;
		else if (i==1)  cnt |= 0x02;
		else if (i==2)  cnt |= 0x04;
		else if (i==3)  cnt |= 0x08;
	}
	else
}

while(cnt)
{
	if(1 == (n&0x01))
	{
		compare_cnt++;
		cnt >>= 1;
	}
}

8.数组地址是常量地址,不可以进行+操作,如果想进行+操作,先进行强制数据类型转换。

eg:

short a[5] = {1,2,3,4,5};

printf("%d \n",a);
printf("%d \n",a + 1);
printf("%d \n",a + 2);
printf("%d \n",a + 3);
printf("%d \n",a + 4);

printf("%d \n",*a);
// printf("%d \n",*(a + 1));
printf("%d \n",*(short *)(a + 1));

9.float 的精度问题:

float能保证的精度是至少有效位数是7位,之后的无法保证。

https://blog.csdn.net/albertsh/article/details/92385277

因为精度问题,因此浮点型的变量不能直接进行等值比较,或者判断==0之类的操作。如果想要比较,先转换成整型的再比较。

10.break使循坏提前跳出,continue强迫程序提前进入下一轮循环;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值