File tree Expand file tree Collapse file tree 2 files changed +57
-0
lines changed Expand file tree Collapse file tree 2 files changed +57
-0
lines changed Original file line number Diff line number Diff line change @@ -19,6 +19,15 @@ int* intPtr;
19
19
上面示例声明了一个变量intPtr,它是一个指针,指向的内存地址存放的是一个整数
20
20
21
21
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
+
22
31
# \* 运算符
23
32
24
33
` * ` 这个符号除了表示指针以外,还可以作为运算符,用来` 取出指针变量所指向的内存地址里面的值 ` 。
Original file line number Diff line number Diff line change
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
+ 宏的优点是相对简单,` 本质上是字符串替换 ` ,不涉及数据类型
You can’t perform that action at this time.
0 commit comments