### 指针深入知识点详解
#### 一、关于指针概念的回顾
1. **内存地址和指针的关系:**
- 在计算机程序中,每个数据都有它在内存中的位置,即内存地址。
- **指针**是一种变量,它的值是另一个变量的地址,也就是内存地址。
- 当我们谈论指针时,实际上是在处理内存地址,通过指针我们可以间接地访问和操作内存中的数据。
2. **什么叫指针?什么是指针变量?**
- **指针**是一种特殊的变量,用于存储内存地址。
- **指针变量**是用来存放内存地址的变量。
- 例如,`int *px;` 声明了一个整型指针变量 `px`,它可以存储指向整型变量的地址。
3. **定义/使用指针变量的步骤**
- 定义指针变量:`数据类型 *指针变量名;`
- 初始化指针变量:可以通过将一个变量的地址赋给指针来初始化它,例如 `int x; int *px = &x;`。
- 使用指针变量:可以通过 `*px` 来访问指针所指向的变量的值。
**注意事项:**
- 指针只能指向同种类型的变量。例如,一个整型指针只能指向整型变量。
- 不能给指针变量赋常量值(除了0或NULL),这会引发编译错误或运行时错误。
#### 二、指针的基本使用案例
- **求两个数的和**
- 方法一:设计一个带返回值的函数实现。
- 方法二:设计一个不带返回值的函数实现(用指针返回和值)。
- 传递实参 `sum` 的地址给形参 `sum`,在函数体内修改形参所指向地址中的内容为 `a + b`。
- 这样实参 `sum` 的值也会被修改为 `a + b` 的结果。
- **求两个数的和与差**
- 问题分析:函数的返回值只能返回一个值,无法直接解决同时返回和与差的问题。
- 方法1:结果存到数组中,元素0存和,元素1存差。
- 方法2:使用指针解决问题。
- 传递两个变量的地址给函数,在函数体内分别计算和与差,并更新这些地址中的值。
#### 三、数组的指针与数组指针变量
- **数组的指针:** 指的是数组的起始地址。
- **数组元素的指针:** 指的是数组元素的地址。
- **数组指针变量:** 指的是指向数组的指针变量。
- 示例声明并初始化数组指针变量:
```c
int a[10], *pa;
pa = a; // 或者 pa = &a[0];
```
- **通过指针引用数组元素**
- `pa`, `a+0`, `&a[0]` 均指向同一单元 — 数组 `a` 的首地址,也是 0 号元素 `a[0]` 的首地址。
- `pa+1`, `a+1`, `&a[1]` 指向数组元素 `a[1]`。
- `pa+i`, `a+i`, `&a[i]` 指向数组元素 `a[i]`。
- **引用数组元素的方法**
- 第一种方法为下标法,即用 `a[i]` 的形式访问数组元素。
- 第二种方法为指针法,采用 `*(a+i)` 形式访问数组元素。
- 如果数组指针变量 `pa` 指向 `a`,则 `pa[i]` 也可以访问数组元素。
#### 四、使用指针变量时需要注意的问题
- 指针变量可以改变自身的值,而常量却不行。
- 指针变量的值可以改变,因此需要确保其始终指向有效的数组元素,C 编译器不会检查数组越界错误。
- 注意指针变量的运算:
- `pa++` 指向下一个元素。
- `*p++` 等价于 `*(p++)` —— 先取 `*p` 值,再令 `p` 加 1。
- `*(++p)` 则先令 `p` 加 1,再取 `*p` 值。
- `(*p)++` 表示取出 `*p` 的值,然后此值再加 1。
#### 五、一维数组、指针和函数
- **一维数组传入函数的方法**
- 形参是数组形式的:`返回值类型 函数名(int a[]);`
- 形参是指针形式的:`返回值类型 函数名(int *p);`
- **利用函数初始化一维数组**
- 可以通过函数来初始化一维数组,例如例 10.4 所示。
- **利用函数输出一维数组**
- 可以通过函数来输出一维数组,例如例 10.5 所示。
#### 六、字符串指针
- **回顾字符数组和字符串的区别**
- `char s1[] = {'h','e','l','l','o'};` 是字符数组。
- `char s2[] = {'h','e','l','l','o','\0'};` 是字符串。
- `char s3[] = "hello";` 是字符串,可读可写。
- `char *p="hello";` 是指向字符串的指针,只读不可写。
- **字符串的输入**
- 可以使用 `scanf("%s", s)` 或 `get(s)` 来输入字符串。
- **利用指针遍历字符串**
- 可以使用指针来遍历字符串,例如 `while (*p != '\0') { ... }`。
以上就是从给定文件的标题、描述以及部分内容中提取的关键知识点,涵盖了指针的基本概念、使用方法以及与数组和函数结合的应用等方面。