Skip to content

Commit 382a9e4

Browse files
committed
Update 07A-pointer-essentials.md
1 parent 4cc527d commit 382a9e4

1 file changed

Lines changed: 67 additions & 8 deletions

File tree

documents/vol1-fundamentals/c_tutorials/07A-pointer-essentials.md

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
---
22
chapter: 1
33
cpp_standard:
4-
- 11
4+
- 11
55
description: 从零开始理解 C 语言指针——内存模型直觉、声明初始化、取地址与解引用运算符、指针的加减运算和距离计算
66
difficulty: beginner
77
order: 9
88
platform: host
99
prerequisites:
10-
- 数据类型基础:整数与内存
11-
- 运算符基础:让数据动起来
10+
- 数据类型基础:整数与内存
11+
- 运算符基础:让数据动起来
1212
reading_time_minutes: 10
1313
tags:
14-
- host
15-
- cpp-modern
16-
- beginner
17-
- 入门
14+
- host
15+
- cpp-modern
16+
- beginner
17+
- 入门
1818
title: 指针入门:地址的世界
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++ 在指针的基础上做了两个关键的改进。第一个是**引用**(
279307
void 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

Comments
 (0)