- Oct 02 Tue 2018 14:34
-
C 語言:使用 enum 作為陣列元素的索引
- May 29 Tue 2018 09:17
-
C 語言:關於 sizeof 及結構及同位的記憶體對齊

C 語言的編譯器有一個內建的巨集 sizeof() 可以用來取得配置給變數的記憶體大小. 例如:
uint32_t varX = 1234;
int size;
size = sizeof(varX);
- Nov 11 Wed 2015 18:13
-
C 語言:消除 C Compiler 對未使用之函數參數之告警
寫 C 程式時偶而會遇到函數的原型宣告多設了一些暫時沒有用到的參數, 一般狀況下只要修改一下標頭檔中的宣告以及實際 C 函數的定義就好了. 不過偶而也會遇到不能改的情形, 例如:
套用某些框架系統時, 函數的原型宣告是框架系統提供的. (一改大概框架系統就不用升版了)
使用函數庫中某個函數的 call back, 而函數庫改不動, 或者沒原始程式, 沒得改.
在開發 embedded system 時, 我們需要實作或者改寫一些函數以取代 C 編譯器的一些預設行為, 例如: Keil ARM/MDK 中要把 printf() 改輸出到 SoC 的 UART.
套用某些框架系統時, 函數的原型宣告是框架系統提供的. (一改大概框架系統就不用升版了)
使用函數庫中某個函數的 call back, 而函數庫改不動, 或者沒原始程式, 沒得改.
在開發 embedded system 時, 我們需要實作或者改寫一些函數以取代 C 編譯器的一些預設行為, 例如: Keil ARM/MDK 中要把 printf() 改輸出到 SoC 的 UART.
- Jul 23 Thu 2015 03:05
-
C 語言:關於變數的二三事

C 語言的變數有所謂的 storage class, 初學時對當中的差異並不是很容易弄清楚, 後來我把各種條件稍作整理, 於是有了下面的表格:
(全域變數)
(區域變數)
- 與同一區塊內的變數同名時, 編譯錯誤.
- 與區塊外層變數同名時, 外層變數被遮蔽.
scope
life-time
及其執行時機
只執行一次, main() 執行前由 "可載入執行檔 ELF" (或二進位影像 binary image) 拷貝至正確之 .data 區段位址內
每一次進入函數或區塊後立即執行
呼叫前執行設定
- Jul 20 Mon 2015 19:15
-
C 語言:運算子優先次序和運算次序
運算子優先權 (C 語言) Percedence Table
C 語言運算子優先權重表
運算子
Operator
說 明
Description
結合順序
Associativity
1
()
[]
->
.
++ --
Function call
Array subscripting
Element selection (of
Element selection (of
increment/decrement (suffix) (註1)
左至右(註2)
2
!
~
++ --
+ -
*
&
(type)
sizeof
logic NOT
bitwise NOT
increment/decrement (prefix)
unary plus and minus
Indirection (dereference, right value)
Address-of (left value)
type cast
Size-of
右至左(註2)
3
* / %
Arithmetic multiplication, division, and remainder
左至右
4
+ -
Arithmetic addition, subtraction
左至右
5
<< >>
Bitwise left shift, right shift
左至右
6
< <=
> >=
Relational less than, not greater than
Relational greater than, not less than
左至右
7
== !=
Relational equal, not equal
左至右
8
&
Bitwise AND
左至右
9
^
Bitwise XOR
左至右
10
|
Bitwise OR
左至右
11
&&
Logical AND
左至右
12
||
Logical OR
左至右
13
?:
Ternary conditional
右至左
14
=
+= -=
*= /= %=
&= ^= |=
<<= >>=
Direct assignment
Assignment by sum, difference
Assignment by product, quotient, remainder
Assignment by bitwise AND, XOR, OR
Assignment by bitwise left shift, right shift
右至左
15
,
Comma
左至右
Operator
Description
Associativity
[]
->
.
++ --
Array subscripting
Element selection (of
struct or union) through pointerElement selection (of
struct or union) by referenceincrement/decrement (suffix) (註1)
~
++ --
+ -
*
&
(type)
sizeof
bitwise NOT
increment/decrement (prefix)
unary plus and minus
Indirection (dereference, right value)
Address-of (left value)
type cast
Size-of
> >=
Relational greater than, not less than
+= -=
*= /= %=
&= ^= |=
<<= >>=
Assignment by sum, difference
Assignment by product, quotient, remainder
Assignment by bitwise AND, XOR, OR
Assignment by bitwise left shift, right shift
- Jul 15 Wed 2015 10:36
-
C 語言:typedef 和 #define 大不同
以前以為 typedef 的功能可以用 #define 來完成, 用起來感覺功能也差不多, 例如:
typedef unsigned char bool; // 用這一行或者是下一行 二選一
//#define bool unsigned char
bool flag1, flag2;
- Jul 08 Wed 2015 23:06
-
C 語言:typedef 的用法
- Jul 07 Tue 2015 16:17
-
C 語言:型別轉換 (Type Casting) 技巧之四 (結構運算子 "->" 和 "." 互換)
程式在移植或者整合時, 有時會遇到使用結構來的定義程式所用到的資料的情形, 有時原作者是用一指向結構的指標來處理, 但是有時也會有直接用結構變數的情形.
這些程式我們在使用的時候按理應該盡量不要更動以免日後改版時造成問題, 不過要是遇到下面二種狀況那就...
原始程式是用指標來指向要處理的結構變數, 而現在我們想把規模縮小, 只會有一份結構變數, 同時也希望最佳化目的碼, 讓系統小一點, 快一點.
或者原始程式中把結構變數寫死了, 所有的函數都是針對那一個結構變數寫的, 結構變數生不出第二個 instance 來. 而我們卻是需要擴充一下, 讓它能處理多個結構變數.
這些程式我們在使用的時候按理應該盡量不要更動以免日後改版時造成問題, 不過要是遇到下面二種狀況那就...
原始程式是用指標來指向要處理的結構變數, 而現在我們想把規模縮小, 只會有一份結構變數, 同時也希望最佳化目的碼, 讓系統小一點, 快一點.
或者原始程式中把結構變數寫死了, 所有的函數都是針對那一個結構變數寫的, 結構變數生不出第二個 instance 來. 而我們卻是需要擴充一下, 讓它能處理多個結構變數.
- Jul 06 Mon 2015 13:40
-
C 語言:型別轉換 (Type Casting) 技巧之三 指定位址 (資料結構, 函數)

外部資料結構
在寫 CPU 或介面晶片的驅動程式時, 經常會使用到某些固定位址, 如: ARM Cortex-M 把系統設定及狀態對應到記憶體的特定位址, 某些周邊 IC, 例如 PCI, USB... 也是使用一小段記憶體空間. (註: 常見的周邊 IC 暫存器定址有二種: 一種是只有二個位址空間, 一個是 '指令/地址暫存器', 一個是 '資料暫存器'; 另一種則是直接使用 CPU 的記憶體空間來對應)
軟體功力較佳的 SoC 晶片製造廠所提供的驅動程式, 通常會將這一小段記憶體空間以結構 (struct) 的方式定義好, 再使用 define 將特定的位址值 (常數), 定義成一虛擬變數. 當然如果晶片功能比較簡單就不見得是用這種方法.
- Jun 30 Tue 2015 18:42
-
C 語言中常見的對等寫法
個人覺得 C 語言最神奇的地方是有好些個對等寫法
類型
相關運算子
寫法一
寫法二
說明/宣告
1.
(變數)取址
"&"
p
&x
2.
(指標)取值
"*"
*p
x
同上
3.
陣列與指標
"[]" and "*"
p[n]
*(p+n)
4.
結構成員
"->" and "."
p->x
(*p).x
p 為指標, 並且指向變數 xp 為陣列變數或者指標變數p 為指標, 並指向一結構x 為該結構成員- Jun 29 Mon 2015 13:15
-
C 語言:型別轉換 (Type Casting) 技巧之二 (不同型別資料之轉換)
C 語言預設會幫我們作一些型別轉換的動作, 一般的型別轉換不只會更換資料型別, 更會使資料內容有所變動, 例如:
float fVar = 1.2;
int32_t iVar;
iVar = fVar; // iVar 值為整數 1
- Jun 28 Sun 2015 12:59
-
C 語言:型別轉換 (Type Casting) 技巧之一
'型別轉換': 基本上就只是在變數/函數前面加一對小括號, 中間填入要轉成什麼型別, 像這個樣子 "(型別)", 例如:
(unsigned char *)ptr
看不出哪一點難, 對吧
不過在實際運用上, 經常會有其他運算元的干擾, 使我們不容易看出式子的意義, 因此我自己寫了二個 macro, 使用上還算方便清楚.
(unsigned char *)ptr
看不出哪一點難, 對吧
不過在實際運用上, 經常會有其他運算元的干擾, 使我們不容易看出式子的意義, 因此我自己寫了二個 macro, 使用上還算方便清楚.