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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章