C語言個人隨筆

2021-10-23 16:16:02 字數 3383 閱讀 4553

for語句使用break,後續條件不會執行。

for

(u8 i=

0x00

;i<

10;i++

)printf

("i=%d"

,i);

結果為i=4。continue會執行後續條件。

查表一般會省去大部分的if判斷條件語句,使用結構體陣列查表會使**看上去不那麼low。

下面**是直接if判斷的:

#define	page_size			0x4000

#define page1 1

#define page1_start_addr 0x08008000

#define page1_end_addr page1_start_addr+page_size

#define page2 2

#define page2_start_addr 0x0800c000

#define page2_end_addr page2_start_addr+page_size

if(validpage == page1)

else

if(validpage == page2)

for(u32 address = validpagestart+

4;address < page2_end_addr;address +=4

)

如果很多地方都要判斷這個valid的話,**會顯得很胖乎!建議查表,下面是陣列查表:

#define	page_size			0x4000

#define page1 1

#define page1_start_addr 0x08008000

#define page1_end_addr page1_start_addr+page_size

#define page2 2

#define page2_start_addr 0x0800c000

#define page2_end_addr page2_start_addr+page_size

u32 page[2]

[2]=

,};for

(u32 address = page[validpage][0

]+4;address < page[validpage][1

];address +=4

)

顯然,上面的陣列在for迴圈裡page[validpage][0]看的不直白,不看定義可能就不會知道他是什麼意義的資料,使用結構體的話就好啦!

結構體查表:

#define	page_size			0x4000

#define page1 1

#define page1_start_addr 0x08008000

#define page1_end_addr page1_start_addr+page_size

#define page2 2

#define page2_start_addr 0x0800c000

#define page2_end_addr page2_start_addr+page_size

typedef

struct

page_struct;

page_struct page[2]

=,};

for(u32 address = page[validpage]

.startaddr+

4;address < page[validpage]

.endaddr;address +=4

)

是不是感覺最後乙個有一點fashion!如果是單個判斷的話,這麼寫沒什麼意義,但是如果經常使用if判斷同乙個變數,我還是用查表吧,看著還高大上。

在微控制器開發中,經常遇到高低位元組計算的問題。如16位資料通過某種8位的協議傳送,這時就要將資料分為高低位元組傳送;或者在讀寫flash時候,我就想讀16位,但是flash只允許32位讀取,這時又需要進行高低16位的計算,等等場合,這時如果使用共同體的話,會使**省去&0xff或者》16的計算。

typedef

struct

bit16_struct;

typedef

union

data_union;

data_union data=

0xaaff

;spi_fifo = data.data8.msb;

//傳送高位

spi_fifo = data.data8.lsb;

//傳送低位

共同體+結構體+陣列 會使資料處理的更加方便。

struct temp_struct

temp_struct;

union temp_union

temp_union;

上述例子將結構體中的位址與陣列的位址一一對應。連續處理用陣列,單獨處理用結構體。

但是遇到結構體變數型別不一致的情況下,就可能會有問題了。

比如:

struct temp_struct

temp_struct;

union temp_union

temp_union;

上述**在執行中就會發現有問題,發現有的陣列和結構體對應不上,

temp_union.temp_struct.halfword_2 和 temp_union.array[2]

位址是對應的,但是

temp_union.temp_struct.halfword_3_4 和 temp_union.array[4]、[5]

位址是對應的,中間的temp_union.array[3]沒人用

這時就應該知道,當使用共同體+結構體+陣列的情況下,應該32位對齊,所以上述結構體宣告應該:

struct temp_struct

temp_struct;

調過來就好了!

通過結構體的位定義可以實現對資料的位操作。

union data16_union

data8;

struct bit_struct

bit;

}temp16;

temp16.bit.bit0 =

1;

最後temp16 = 1;

代替

#ifndef __xx_h

#define __xx_h

//#endif

有些編譯器不支援。

C語言隨筆 型別宣告

有位同學說,老師,我執行如下 結果報錯了 include int main 報錯結果是 configuration test win32 debug compiling.demo.c d ccode test demo.c 4 error c2059 syntax error type error ...

C語言學習隨筆

學習c語言過程中的一些記錄,供以後查閱使用。11月25日學習記錄 1.include指令和標頭檔案 inlcude 1 include的作用相當於把stdio.件中的所有內容都輸入該行所在的位置,實際上,這是一種 拷貝 貼上 的操作。2 include是一條c預處理指令,通常,c編譯器會在編譯前對源...

C語言考試重點隨筆

變數名規定 1.只能是字母 數字和下劃線組成。2.第乙個必須由字母或者下劃線開頭 3.變數名區分大小寫 4.不能使用關鍵字來命名變數 運算子優先順序 優先順序運算子 名稱或含義 使用形式 結合方向說明1 陣列下標 陣列名 常量表示式 左到右 圓括號 表示式 函式名 形參表 成員選擇 物件 物件.成員...