Skip to content

Commit 422f8c7

Browse files
author
Yanbin Zhu
committed
feat(*): 预处理器
1 parent 0d42398 commit 422f8c7

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

data/blog/c语言/pointer.mdx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ int* intPtr;
1919
上面示例声明了一个变量intPtr,它是一个指针,指向的内存地址存放的是一个整数
2020

2121

22+
## 指针的大小
23+
指针的大小与系统的体系结构(也称为字长)密切相关:
24+
25+
- `32 位系统`:在 32 位系统中,指针的大小通常是 `4 个字节(32 位)`,因为 32 位系统的内存地址空间是 4GB,地址需要 32 位来表示。
26+
- `64 位系统`:在 64 位系统中,指针的大小通常是 `8 个字节(64 位)`,因为 64 位系统可以访问更大的内存地址空间,地址需要 64 位来表示。
27+
28+
因此,在 64 位系统中,任何类型的指针(无论是 char*、int* 还是 double*)的大小都是 8 个字节,因为它们都存储内存地址,而地址在 64 位系统中占 64 位(即 8 字节)。
29+
30+
2231
# \* 运算符
2332

2433
`*`这个符号除了表示指针以外,还可以作为运算符,用来`取出指针变量所指向的内存地址里面的值`

data/blog/c语言/预处理器.mdx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
---
2+
title: 预处理器
3+
date: '2024-10-03'
4+
tags: ['C语言']
5+
draft: false
6+
summary: 预处理器(preprocessor)
7+
---
8+
9+
## \#define
10+
11+
`#define`是最常见的预处理指令,用来将指定的词`替换`成另一个词。它的参数分成两个部分,第一个参数就是要被替换的部分,其余参数是替换后的内容。`每条替换规则`,称为一个`宏(macro)`
12+
13+
14+
```C
15+
#define MAX 100
16+
```
17+
上面示例中,#define指定将源码里面的MAX,全部替换成100。MAX就称为一个宏。
18+
19+
`宏是原样替换`,指定什么内容,就一模一样替换成什么内容,`区别于函数`。
20+
21+
### 1.带参数的宏
22+
宏的强大之处在于,它的名称后面可以使用括号,指定接受一个或多个参数。
23+
```C
24+
#define SQUARE(X) X*X
25+
```
26+
27+
`这种写法很像函数,但又不是函数`,而是完全原样的替换,会跟函数有不一样的行为。
28+
29+
```C
30+
#define SQUARE(X) X*X
31+
32+
// 输出19
33+
printf("%d\n", SQUARE(3 + 4));
34+
```
35+
面示例中,`SQUARE(3 + 4)`如果是函数,输出的应该是49(`7*7`);宏是原样替换,所以替换成`3 + 4*3 + 4`,最后输出19。
36+
37+
如果宏的长度过长,可以使用`反斜杠(\)折行,将宏写成多行`。
38+
```C
39+
#define PRINT_NUMS_TO_PRODUCT(a, b) { \
40+
int product = (a) * (b); \
41+
for (int i = 0; i < product; i++) { \
42+
printf("%d\n", i); \
43+
} \
44+
}
45+
```
46+
上面示例中,替换文本放在大括号里面,这是为了创造一个块作用域,避免宏内部的变量污染外部。
47+
48+
宏的优点是相对简单,`本质上是字符串替换`,不涉及数据类型

0 commit comments

Comments
 (0)