2014年6月25日 星期三

Note for C

printf
%p 被用來格式化位址 (16進位, e.g., 0x3E8FA0)
====================================================================
指標有時候會被稱為 reference(參考), *運算子可用來 dereference(解參考)指標.


struct, union, enum 這三者要一起看

typedef struct cell_phone{

...
...
...
} phone;
不需要像上面這種寫法,可以略過struct的名稱,直接定義別名(alias),如下面的寫法。
typedef struct {
...
...
...
} phone;
依照上述例子 phone 是別名
phone *myPhone;
//(*myPhone).xxx == myPhone->xxx
//上述兩式相等
struct結構中可以包含指向另一個struct的指標,但是struct本身不可以再包含完整的遞迴struct。因為C語言必須知道struct確切占據多少記憶體空間。


union的用法與struct相同,但是union只會針對它所定義的欄位之一配置記憶體空間,電腦將提供該union足以存放其最大欄位的空間。
typedef union {
    short count;
    float weight;
    float volume;
} quantity;
quantity q = {.weight=1.5};
上述初始化等同於,下面這種寫法
quantity q;
q.weight = 1.5;


enum讓你可以列舉出一序列的符號,像下面這樣:
enum color {RED, GREEN, PUCE};


bitfield可以讓我們儲存自訂數目的位元,並且應該被宣告為unsigned int。
例如:
typedef struct {
    unsigned int first_visit:1; //表示該欄位只占用一個位元(1bit)
    unsigned int come_again:1;
    unsigned int figner_lost:4;
    unsigned int shark_attack:1;
    unsigned int days_a_week:3; //表示該欄位占用三個位元(3bit)
} survey;


配置與釋放必須一對一
從heap配置動態記憶體 void *p = malloc(sizeof(int)*4);
釋放記憶體 free(p);

如何配置動態二維陣列?
如欲配置一[m][n]的二維陣列
有下列幾種作法
(ㄧ)
int **Array, *pData; 
int m,n,i; 
Array = (int**)malloc(m*sizeof(int *)); 
pData = (int*)malloc(m*n*sizeof(int)); 
for(i = 0; i < m; i++, pData += n)
Array[i] = pData;
只需做兩次malloc,free只要free Array和Array[0]就可以了
(二)
int i;
int **Array;
Array = (int **)malloc(m*sizeof(void *));
for (i = 0; i < m; i++)
Array = (int *)malloc(n*sizeof(int *));
這樣子的配置方式要做很多次的malloc,,並容易造成記憶體碎片化(memory fragment)
(三)
int i;
int **Array, *pData;
Array = (int **)malloc(m*sizeof(int *)+m*n*sizeof(int));
for (i = 0, pData = (int *)(Array+m); i < m; i++, pData += n)
Array[i]=pData;

這樣是最簡便的寫法 只要mallocㄧ次完成,free只要free Array即可

Ref: http://chiakie.pixnet.net/blog/post/3143518-%5Bc%5D-%E5%A6%82%E4%BD%95%E5%8B%95%E6%85%8B%E9%85%8D%E7%BD%AE%E4%BA%8C%E7%B6%AD%E9%99%A3%E5%88%97

沒有留言:

張貼留言