介绍
在 C 语言编程中,指针是强大的特性,它允许我们通过直接访问和修改内存地址来操作数据。指针的一个常见应用是在不使用第三个变量的情况下交换两个变量的值。
在这个实验中,我们将学习如何创建一个使用指针交换两个数字的 C 程序。这种技术在各种编程场景中都非常基础,并且展示了指针在内存操作方面的实际应用。
本实验将指导你从头开始创建一个程序,对其进行编译并运行,以观察交换操作的实际效果。
理解 C 语言中的指针
在开始编码之前,让我们先了解一下什么是指针以及它们在 C 语言中是如何工作的。
什么是指针?
指针是一种变量,它存储的是另一个变量的内存地址。指针在 C 语言中至关重要,因为它们允许直接访问内存,并能更高效地操作数据。
指针语法
在 C 语言中,使用星号 (*) 符号来声明指针:
int *ptr; // 声明一个指向整数的指针
在使用指针时,我们会用到两个重要的运算符:
- 取地址运算符 (
&) —— 获取变量的内存地址 - 解引用运算符 (
*) —— 访问指针所指向地址中存储的值
创建第一个文件
让我们从在项目目录中创建主 C 文件开始。打开集成开发环境(IDE),创建一个名为 main.c 的新文件:
- 在文件资源管理器面板(左侧)中,导航到
/home/labex/project - 右键单击并选择“新建文件”
- 将文件命名为
main.c - 在文件中添加以下基本结构:
#include <stdio.h>
int main() {
// 我们将在这里添加代码
return 0;
}
这将创建一个简单的 C 程序,其中包含标准输入/输出库,并且有一个主函数,当程序成功完成时返回 0。
创建交换程序结构
既然我们已经理解了指针,那就让我们逐步构建交换程序。
声明变量和指针
我们需要声明:
- 两个整数变量 (
a和b),用于存储我们想要交换的值 - 两个整数指针 (
ptra和ptrb),用于存储a和b的地址 - 一个临时变量 (
temp),用于辅助交换操作
使用以下代码更新你的 main.c 文件:
#include <stdio.h>
int main() {
// 声明变量
int a, b;
int *ptra, *ptrb;
int temp;
// 从用户处获取输入
printf("Enter value for a: ");
scanf("%d", &a);
printf("Enter value for b: ");
scanf("%d", &b);
// 显示原始值
printf("\nOriginal values:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
// 我们将在下一步添加更多代码
return 0;
}
理解代码
让我们分析一下目前所做的工作:
- 我们声明了两个整数
a和b,用于存储我们想要交换的值 - 我们声明了两个整数指针
ptra和ptrb,用于存储a和b的内存地址 - 我们声明了一个临时整数
temp,用于辅助交换操作 - 我们添加了代码,提示用户输入
a和b的值 - 我们添加了代码,显示
a和b的原始值
注意,在 scanf 函数中,我们使用取地址运算符 (&) 来告知函数将输入值存储在内存中的位置。
实现交换逻辑
现在,让我们使用指针来实现实际的交换逻辑。
将地址赋值给指针
首先,我们需要通过将 a 和 b 的地址分别赋值给 ptra 和 ptrb,让指针指向我们的变量:
// Assign addresses to pointers
ptra = &a;
ptrb = &b;
使用指针的交换算法
使用指针交换值的关键在于操作内存位置上的值,而不仅仅是指针本身。以下是具体的操作步骤:
- 将
a的值(通过*ptra访问)存储到临时变量temp中 - 将
b的值(通过*ptrb访问)赋值给a(使用*ptra) - 将临时值(
a的原始值)赋值给b(使用*ptrb)
在之前步骤所指示的位置添加以下代码,更新你的 main.c 文件:
#include <stdio.h>
int main() {
// Declare variables
int a, b;
int *ptra, *ptrb;
int temp;
// Get input from user
printf("Enter value for a: ");
scanf("%d", &a);
printf("Enter value for b: ");
scanf("%d", &b);
// Display original values
printf("\nOriginal values:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
// Assign addresses to pointers
ptra = &a;
ptrb = &b;
// Display memory addresses (optional but helpful for understanding)
printf("\nMemory addresses:\n");
printf("Address of a: %p\n", ptra);
printf("Address of b: %p\n", ptrb);
// Swap the values using pointers
temp = *ptra; // Store value of a in temp
*ptra = *ptrb; // Assign value of b to a
*ptrb = temp; // Assign original value of a to b
// Display swapped values
printf("\nAfter swapping:\n");
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
理解交换逻辑
让我们详细了解交换是如何实现的:
temp = *ptra;——*运算符对指针进行解引用,访问内存位置上的值。这行代码将a的值存储到temp中。*ptra = *ptrb;—— 这行代码将b的值赋给a的内存位置,实际上改变了a的值。*ptrb = temp;—— 这行代码将a的原始值(存储在temp中)赋给b的内存位置,完成交换。
经过这些操作后,变量 a 和 b 交换了值,而且我们没有直接修改它们,只是修改了它们内存位置上的值。
编译并测试交换程序
现在我们已经完成了程序,让我们编译并运行它,看看结果如何。
编译程序
为了编译程序,我们将使用 GNU C 编译器(gcc)。在 WebIDE 中打开一个终端,然后运行以下命令:
cd ~/project
gcc main.c -o swap_program
这个命令会编译我们的 main.c 文件,并创建一个名为 swap_program 的可执行文件。
运行程序
现在让我们运行程序,看看它是否能正确交换值:
./swap_program
你会被提示输入 a 和 b 的值。例如,我们输入:
a= 5b= 10
程序应该会显示:
- 原始值:a = 5,b = 10
a和b的内存地址- 交换后的值:a = 10,b = 5
理解输出
当你运行程序时,你会看到几个输出部分:
- 原始值 —— 显示交换前的值
- 内存地址 —— 显示变量在内存中的存储位置(每次运行程序时会不同)
- 交换后 —— 显示交换操作后的值
尝试使用不同的输入值多次运行程序,以确认交换操作始终能正常工作。
幕后工作原理
让我们直观地了解一下内存中发生了什么:
- 最初,如果
a = 5且b = 10,它们各自有自己的内存位置 ptra指向a的内存位置ptrb指向b的内存位置- 在交换过程中:
temp获取ptra处的值(即 5)ptra处的值被更改为ptrb处的值(即 10)ptrb处的值被更改为temp的值(即 5)
- 交换后,
a = 10且b = 5,有效地交换了它们的值
这展示了指针的强大之处 —— 它们允许我们通过直接操作内存位置来间接修改值。
总结
在这个实验中,我们学习了如何在 C 语言中使用指针来交换两个变量的值。涵盖的关键概念包括:
- 指针:存储其他变量内存地址的变量
- 内存地址:计算机内存中存储数据的唯一位置
- 指针操作:
- 取地址运算符 (
&),用于获取变量的内存地址 - 解引用运算符 (
*),用于访问内存地址处的值
- 取地址运算符 (
- 交换算法:使用临时变量和指针来交换值
这种技术是 C 语言编程中的一个基本概念,展示了指针在内存操作方面的强大功能。它可以应用于各种编程场景,如排序算法、数据结构操作和函数实现。
通过理解如何通过内存地址来操作数据,你在掌握 C 语言编程和计算机内存概念方面迈出了重要的一步。



