11---
22chapter : 1
33cpp_standard :
4- - 11
4+ - 11
55description : 从零开始理解 C 语言指针——内存模型直觉、声明初始化、取地址与解引用运算符、指针的加减运算和距离计算
66difficulty : beginner
77order : 9
88platform : host
99prerequisites :
10- - 数据类型基础:整数与内存
11- - 运算符基础:让数据动起来
10+ - 数据类型基础:整数与内存
11+ - 运算符基础:让数据动起来
1212reading_time_minutes : 10
1313tags :
14- - host
15- - cpp-modern
16- - beginner
17- - 入门
14+ - host
15+ - cpp-modern
16+ - beginner
17+ - 入门
1818title : 指针入门:地址的世界
1919---
20+
2021# 指针入门:地址的世界
2122
2223指针大概是 C 语言里名声最响也最容易劝退新手的特性了。如果你之前接触过 Python 或 Java,可能习惯了"变量就是对象本身"的思维——变量里存的就是数据。但到了 C 这边,多了一个关键概念:每个变量都住在内存的某个位置,这个位置有一个编号(地址)。指针就是用来存储和操作这些地址的变量。
@@ -35,7 +36,7 @@ title: 指针入门:地址的世界
3536
3637我们接下来的所有实验都在这个环境下进行:
3738
38- - 平台:Linux x86 \_ 64 (WSL2 也可以)
39+ - 平台:Linux x86_64 (WSL2 也可以)
3940- 编译器:GCC 13+ 或 Clang 17+
4041- 编译选项:` -Wall -Wextra -std=c17 `
4142
@@ -268,6 +269,33 @@ C++ 在指针的基础上做了两个关键的改进。第一个是**引用**(
268269
269270写一个程序,声明三个不同类型的变量(` int ` 、` double ` 、` char ` ),打印它们的值、地址和 ` sizeof ` 结果。观察地址之间的间隔是否符合各类型的大小。
270271
272+ ### 练习 1 参考答案
273+
274+ ``` c
275+ #include < stdio.h>
276+
277+ int main (void) {
278+
279+ int value_int = 0;
280+ double value_double = 0.0;
281+ char value_char = '0';
282+
283+ printf("(int) value:%d address:%p size:%d\n", value_int, &value_int, sizeof(int));
284+ printf("(double) value:%.2f address:%p size:%d\n", value_double, &value_double, sizeof(double));
285+ printf("(char) value:%d address:%p size:%d\n", value_char, &value_char, sizeof(char));
286+ return 0;
287+ }
288+
289+ ```
290+
291+ 输出结果可能为:
292+
293+ ```text
294+ (int) value:0 address:00000000005ffe8c size:4
295+ (double) value:0.00 address:00000000005ffe80 size:8
296+ (char) value:48 address:00000000005ffe7f size:1
297+ ```
298+
271299### 练习 2:指针遍历数组
272300
273301用指针算术遍历一个 ` int ` 数组并打印所有元素。要求不使用 ` [] ` 运算符,只用指针加减和解引用:
@@ -279,6 +307,37 @@ C++ 在指针的基础上做了两个关键的改进。第一个是**引用**(
279307void print_int_array (const int* data, size_t count);
280308```
281309
310+ ### 练习 1 参考答案
311+
312+ ```c
313+ #include <stdio.h>
314+
315+ void print_int_array(const int* data, size_t count);
316+
317+ int main(void) {
318+ int arr[] = {1, 2, 3, 4, 5};
319+ print_int_array(arr, 5);
320+ return 0;
321+ }
322+
323+ void print_int_array(const int* data, size_t count) {
324+ for (size_t i = 0; i < count;i++) {
325+ printf("data[%d] = %d\n", i, *(data + i));
326+ }
327+ }
328+
329+ ```
330+
331+ 输出结果应当为:
332+
333+ ``` text
334+ data[0] = 1
335+ data[1] = 2
336+ data[2] = 3
337+ data[3] = 4
338+ data[4] = 5
339+ ```
340+
282341## 参考资源
283342
284343- [ cppreference: 指针声明] ( https://en.cppreference.com/w/c/language/pointer )
0 commit comments