C 语言反转数组

17 Mar 2025 | 6 分钟阅读

任务是反转给定数组的元素。我们可以使用多种方法来完成此任务,这是一个基本问题。它是面试中最常被问到的问题之一。本教程列出了在 C 语言中反转数组的所有可能方法。

例如,假设给定一个数组

Reverse an Array in C

我们需要反转数组并打印以下内容

Reverse an Array in C

在 Python 中,我们可以使用列表切片并指定步长为 -1 -> list [::-1] 来获取反转后的列表。在 C 语言中,没有切片机制。因此,我们需要深入底层解决。

可能的方法

  1. 声明另一个数组
  2. 迭代和交换
  3. 使用指针

1. 声明另一个数组

我们可以声明另一个数组,从后向前迭代原始数组,并将元素从开头复制到新数组。

代码

输出

Enter the size of the array: 5
Enter the elements: 1 2 3 4 5
The Reversed array: 5 4 3 2 1

这里有一个例子

如果数组是

Reverse an Array in C

我们创建一个大小相同的新数组 rev = 6

Reverse an Array in C

第一次迭代: i = n - 1 = 5,i >= 0,j = 0

rev[0] = arr[5]

同样

第二次迭代: rev[1] = arr[4]

第三次迭代: rev[2] = arr[3]

第四次迭代: rev[3] = arr[2]

第五次迭代: rev[4] = arr[1]

第六次迭代: rev[5] = arr[0]

因此,结果反转数组

Reverse an Array in C

2. 迭代和交换

迭代数组的一半

我们迭代到 size/2 的位置,对于索引为 i 的元素,我们将其与索引为 (size - i - 1) 的元素进行交换。

这里有一个例子

如果数组是

Reverse an Array in C

size = 6,size/2 = 3

第一次迭代: i = 0,i < 3

我们交换 arr[i] 和 arr[n - i - 1]

arr[0] <-> arr[5]

Reverse an Array in C

第二次迭代: i = 1,i < 3

我们交换 arr[i] 和 arr[n - i - 1]

arr[1] <-> arr[4]

Reverse an Array in C

第三次迭代: i = 2,i < 3

我们交换 arr[i] 和 arr[n - i - 1]

arr[2] <-> arr[3]

当 i = 3 时终止,因为 i == n/2

结果反转数组

Reverse an Array in C

代码

输出

Enter the size of the array: 6
Enter the elements: 1 2 3 4 5 6
The reversed array: 6 5 4 3 2 1

从数组两端迭代

我们可以一直迭代并交换数组两侧的元素,直到到达中间元素。

代码

输出

Enter the size of the array: 6
Enter the elements: 1 2 3 4 5 6
The Reversed array: 6 5 4 3 2 1

这里有一个例子

如果数组是

Reverse an Array in C

size = 6

l = 0,h = size - 1 = 5

第一次迭代: l = 0,h = 5

我们交换 arr[l] 和 arr[h]

arr[0] <-> arr[5]

Reverse an Array in C

第二次迭代: l = 1,h = 4

我们交换 arr[l] 和 arr[h]

arr[1] <-> arr[4]

Reverse an Array in C

第三次迭代: l = 2,h = 3

我们交换 arr[l] 和 arr[h]

arr[2] <-> arr[3]

当 l = h = 3 时终止,因为 l !< h

结果反转数组

Reverse an Array in C

递归方式

输出

Enter the size of the array: 6
Enter the elements: 1 2 3 4 5 6
The reversed array: 6 5 4 3 2 1

3. 使用指针

指针是一种特殊的变量,可以存储其他变量和指针的地址。我们可以使用指针而不是传统的数组索引来交换数组元素。

关于指针的重要说明

  1. 指针必须声明为 **数据类型* 名称**。指针只能存储指定数据类型的变量的地址。
  2. 假设我们声明了一个指针 **\*ptr**;如果我们希望指针指向变量 **a**,则需要声明 **ptr = &a**
  3. **\*ptr** 给出指针所指向变量的值,**&ptr** 给出指针的地址,**ptr** 给出它所指向的变量的地址。
  4. 当我们说 **ptr + 1** 或 ptr - 1 时,会发生 **指针算术**,这是相对于数据类型的:如果数据类型是 int,则 int 的大小 = 4。因此,**ptr + 1 -> ptr + 1(4)** 将是 ptr 将指向的下一个地址。

代码

输出

Enter the size of the array: 6
Enter the elements into the array: 1 2 3 4 5 6
The reversed array: 6 5 4 3 2 1

理解

  • 我们声明了两个整型指针 ptr1 和 ptr2。
  • ptr1 指向数组的第一个元素,ptr2 指向数组的最后一个元素。
  • 当我们说 ptr1 和 ptr2 指向数组第一个和最后一个元素的地址时。
  • 数组在连续的内存位置中存储元素。数组从第一个元素到最后一个元素的内存分配将按递增顺序进行;因此,while 循环中使用条件 ptr1 < ptr2。
  • 现在,使用 \*ptr1 和 \*ptr2,我们使用临时变量 temp 交换 ptr1 和 ptr2 的值。
  • 我们使用简单的指针算术将 ptr1 递增到其后继元素,并将 ptr2 递减到其前驱元素。
  • 交换继续进行,直到 ptr1 和 ptr2 都到达中间元素,或者当 ptr1 和 ptr2 在其迭代中超过数组的中间元素时。