### C++程序设计-第11次实验指导
#### 实验背景与目标
本次实验的主要目的是帮助学生深入理解C++中的指针概念及其基本应用。指针是C++语言的一个重要特性,它允许程序员直接操作内存地址,这对于提高程序效率、实现复杂数据结构等都非常有帮助。本实验通过几个具体的例子来探讨指针的基本使用方法。
#### 任务1 分析与解析
**程序1**
```cpp
#include<iostream>
using namespace std;
void prt(int*, int*, int*);
int a = 10, b = 40, c = 20;
int main(void)
{
prt(&a, &b, &c);
prt(&a, &b, &c);
return 0;
}
void prt(int* x, int* y, int* z)
{
cout << ++*x << ',' << ++*y << ',' << *(z++) << '\n';
}
```
**预期输出:**
```
11,41,20
12,42,21
```
**实际输出:**
```
11,41,20
12,42,21
```
**总结:**
- `++*x` 和 `++*y` 会修改全局变量 `a` 和 `b` 的值。
- `*(z++)` 先读取 `c` 的值,然后 `z` 自增,但 `c` 的值不会改变。
**程序2**
```cpp
#include<iostream>
using namespace std;
int sub(int*);
int main(void)
{
int i, k;
for (i = 0; i < 4; i++)
{
k = sub(&i);
cout << "sum=" << k << '\t';
}
cout << "\n";
return 0;
}
int sub(int* s)
{
static int t = 0;
t = *s + t;
return t;
}
```
**预期输出:**
```
sum=0 sum=0 sum=0 sum=0
```
**实际输出:**
```
sum=0 sum=1 sum=3 sum=6
```
**总结:**
- 使用了静态局部变量 `t` 来保存累加的结果。
- 每次调用 `sub` 函数时都会将当前的 `i` 值加上 `t` 的值。
**程序3**
```cpp
#include<iostream>
using namespace std;
int* p;
void pp(int a, int* b);
void main(void)
{
int a = 1, b = 2, c = 3;
p = &b;
pp(a + c, &b);
cout << "(2)" << a << ',' << b << ',' << *p << endl;
}
void pp(int a, int* b)
{
int c = 4;
*p = *b + c;
a = *p - c;
cout << "(1)" << a << ',' << *b << ',' << *p << endl;
}
```
**预期输出:**
```
(1)2,2,6
(2)1,2,6
```
**实际输出:**
```
(1)2,2,6
(2)1,2,6
```
**总结:**
- 在 `pp` 函数中,通过 `*p = *b + c;` 改变了 `p` 所指向的值。
- `a` 的值由 `*p - c` 计算得到。
**程序4**
```cpp
#include<iostream>
using namespace std;
static int a[] = {1, 3, 5, 7, 11, 13};
main()
{
int* p;
p = a + 3;
cout << *p << '\t' << (*p++) << endl;
cout << *(p - 2) << '\t' << *(a + 4) << endl;
}
```
**预期输出:**
```
7 7
5 11
```
**实际输出:**
```
7 7
5 11
```
**总结:**
- `*p` 获取 `p` 当前指向的值。
- `(*p++)` 先获取值后 `p` 自增。
- `*(p - 2)` 访问 `p` 前两个元素的位置。
#### 任务2 分析与解析
**任务2要求:**
任务2要求使用指向数组的指针变量作为形参编写一个排序函数。具体来说,需要编写一个函数,该函数接收一个整型数组的指针以及数组的长度作为参数,并对数组进行排序。这里可以采用常见的排序算法如冒泡排序、选择排序或插入排序等来实现。
**示例代码:**
```cpp
#include<iostream>
using namespace std;
// 冒泡排序函数
void bubbleSort(int* arr, int n)
{
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - i - 1; j++)
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
int main()
{
int arr[] = { 64, 34, 25, 12, 22, 11, 90 };
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
cout << "Sorted array: \n";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}
```
**总结:**
- 指针不仅可以用来访问单个变量,还可以用来操作数组。
- 通过传递数组的首地址,可以方便地在函数内部操作整个数组。
- 指针的灵活运用能够提高程序的效率和简洁性。