Cprogramming 简明教程

Pointer vs Array in C

ArraysPointers 是 C 语言中的两个重要语言结构,在许多方面相互关联。在许多情况下,您使用指针执行的任务也可以在数组的帮助下执行。

但是,数组和指针之间存在某些概念差异。阅读本章以了解它们的差异以及各自的优缺点。

Arrays in C

在 C 程序中,数组是由相同类型元素组成的索引集合,这些元素存储在相邻的内存位置中。

declare an array, 我们使用以下 syntax

data_type arr_name [size];

size 应为非负整数。例如:

int arr[5];

array can be initialized along with the declaration, with the elements given as a comma-separated list inside the curly brackets. Mentioning its size is optional.

int arr[] = {1, 2, 3, 4, 5};

数组中的每个元素都以一个从“0”开始的唯一 integral index, 为特征。在 C 语言中,数组的 lower bound 总为“0”,而 upper bound 为“size – 1”。

Example of an Array

以下示例展示了如何遍历带有索引下标的数组 -

#include <stdio.h>

int main (){

   /* an array with 5 elements */
   int arr[5] = {10, 20, 30, 40, 50};

   int i;

   /* output each array element's value */
   printf("Array values with subscripts: \n");

   for(i = 0; i < 5; i++){
      printf("arr[%d]: %d\n", i, arr[i]);
   }

   return 0;
}

当你运行这段代码时,它将产生以下输出:

Array values with subscripts:
arr[0]: 10
arr[1]: 20
arr[2]: 30
arr[3]: 40
arr[4]: 50

Pointers in C

C 允许你访问一个变量的存储器位置,这个变量已由编译器随机分配。 address−of operator (&) 返回变量的地址。

variable 存储一个变量的地址称为指针。指针的类型必须与它存储地址的类型相同。

为了与目标变量类型区分开来,指针名称前缀为星号 ( ). If we have an *int 变量,其指针声明为 "int *".

int x = 5;
int *y = &a;

Note: 对于数组,其第 0 个元素的地址分配给指针。

int arr[] = {1, 2, 3, 4, 5};
int *ptr = &arr[0];

事实上,数组本身的名称解析为第 0 个元素的地址。

pointer vs array

因此,我们同样可以编写 -

int *ptr = arr;

由于数组元素放置在相邻的存储器位置中,每个下标的地址递增 4(对于 int 数组),我们可以使用此功能借助指针来遍历数组元素。

Example of a Pointer

以下示例展示了如何遍历带有指针的数组 -

#include <stdio.h>

int main (){

   /* an array with 5 elements */
   int arr[5] = {10, 20, 30, 40, 50};
   int *x = arr;

   int i;

   /* output each array element's value */
   printf("Array values with pointer: \n");

   for(i = 0; i < 5; i++) {
      printf("arr[%d]: %d\n", i, *(x+i));
   }

   return 0;
}

运行代码并检查其输出:

Array values with pointer
arr[0]: 10
arr[1]: 20
arr[2]: 30
arr[3]: 40
arr[4]: 50

Difference between Arrays and Pointers in C

下表突显了数组和指针之间的重要区别 -

Array

Pointer

它存储同类数据类型的所有元素中的相邻存储器位置。

它存储一个变量或一个数组的地址

一个数组被定义为类似数据类型的集合。

一个指针是一个存储另一个变量的地址的变量。

可以存储的变量数由数组的大小决定。

一个指针只能存储一个变量的地址。

可以在定义数组时对其初始化。

无法在定义指针时对其进行初始化。

数组的本质是静态的。

指针的本质是动态的。

根据用户需要,不能调整数组的大小。

随时都可以调整指针的大小。

在编译时完成数组分配。

在运行时完成指针分配。