###### tags: `C/C++` `coding`
# 有的沒的 in C
## Memory operation
### **記憶體配置**

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}]"}
tags: C/C++
coding
有的沒的 in C Memory operation 語法相關 cnt++ vs ++cnt