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強迫程序提前進入下一輪循環;