###### tags: `C/C++` `coding` # 有的沒的 in C ## Memory operation ### **記憶體配置** ![](https://i.imgur.com/8VCB4CI.png =45%x) 1. Data:初始化靜態變數(static variables, globel variablas) 2. Stack:區域變數(呼叫函數的區域變數) 3. Heap:動態配置變數 (malloc or new 所建立的變數) #### **malloc** 1.有加(int*)將malloc返回的型態從"通用指標" (*void) 轉成 我們要的型態 2.有加比較好,能夠安全使用 ```c= int *a = (int*)malloc(sizeof(int)); int *b = malloc(sizeof(int)); ``` ## 語法相關 ### **ToBinaryFormat** ```c= #define BYTE_TO_BINARY_PATTERN "%c%c%c%c %c%c%c%c" #define BYTE_TO_BINARY(byte) \ (byte & 0x80 ? '1' : '0'), \ (byte & 0x40 ? '1' : '0'), \ (byte & 0x20 ? '1' : '0'), \ (byte & 0x10 ? '1' : '0'), \ (byte & 0x08 ? '1' : '0'), \ (byte & 0x04 ? '1' : '0'), \ (byte & 0x02 ? '1' : '0'), \ (byte & 0x01 ? '1' : '0') unsigned char a = 0x50; printf("sizeof(a) = %lu\n",sizeof(a)); printf("a=%c%c%c%c %c%c%c%c",BYTE_TO_BINARY(a)); /*-------output-----------*/ sizeof(a)=1 a=0101 0000 ``` ### **typedef** 1. 宣告在一起 -> 將"struct ListNode" 省略為 "ListNode" ```c= typedef struct ListNode{ int val; struct Node* next; }ListNode; ``` 2. 分開宣告 -> 將"struct ListNode" 縮寫成 "ListNode" ```c= struct ListNode{ int val; struct ListNode *next; }; typedef struct ListNode ListNode; ``` ### **static 靜態變數** 執行完之後數值還會存在,再單個原始檔範圍內可見 (它們的值只能被同一檔案中的函式使用) (call 同個 function 不會再被初始化) ```c= void main(){ for(int i=0; i<3; i++){ printf("%d",count()); } } void count() { static int c = 1; printf("%d,", c); c++; } /*-------output----------*/ 1,2,3 ``` ### **指標** ```c= void main(){ int a = 9, b = 1, *p = &a, *q = &b; //p是一個指標指到a (存放a變數的addr) q同上 printf("%d %d %d %d %d %d",a ,b ,*p ,*q ,p ,q); } /*-----------output------------*/ 9 1 9 1 6422284(a.addr) 6422288(b.addr) ``` ### **Union** 共用同一個記憶體空間 (以最大的為準) ```c= union Var{ char ch; //1byte int num1; //4bytes double num2; //8bytes }; int main(void) { union Var var = {'x'}; // 初始化只能指定第一個成員 // union Var var = {123}; 這句是不行的 printf("var.size is %d\n",sizeof(var)); printf("var.ch = %c\n",var.ch); printf("var.num1 = %d\n",var.num1); // 內容是無效的 printf("var.num2 = %.3f\n\n",var.num2); // 內容是無效的 var.num1 = 123; printf("var.ch = %c\n",var.ch); // 內容是無效的 printf("var.num1 = %d\n",var.num1); printf("var.num2 = %.3f\n\n",var.num2); // 內容是無效的 var.num2 = 456.789; printf("var.ch = %c\n",var.ch); // 內容是無效的 printf("var.num1 = %d\n",var.num1); // 內容是無效的 printf("var.num2 = %.3f\n\n",var.num2); return 0; } /*-----output-----*/ var.size is 8 var.ch = x var.num1 = 120 var.num2 = 0.000 var.ch = { var.num1 = 123 var.num2 = 0.000 var.ch = � var.num1 = -1099511628 var.num2 = 456.789 ``` ### cnt++ vs ++cnt +cnt --> 先+1再判斷 cnt+ --> 先判斷再+1 ```c= int main() { int cnt = 0; for(int i=0; i<10; i++){ if (++cnt<=5){ printf("cnt:%d,", cnt); } } printf("\n"); cnt =0; for(int i=0; i<10; i++){ if (cnt++<=5){ printf("cnt:%d,", cnt); } } return 0; } /*-----output-----*/ cnt:1,cnt:2,cnt:3,cnt:4,cnt:5, cnt:1,cnt:2,cnt:3,cnt:4,cnt:5,cnt:6, ```
{"metaMigratedAt":"2023-06-16T23:10:58.537Z","metaMigratedFrom":"Content","title":"有的沒的 in C","breaks":true,"contributors":"[{\"id\":\"cd6cb11a-6199-4bb2-a746-495f3488eb41\",\"add\":3636,\"del\":439}]"}
Expand menu