%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
沒有留言:
張貼留言