C语言中指针与数组



数组指针 是C语言中两个重要的语言结构,它们在许多方面彼此相关。在许多情况下,使用指针执行的任务也可以借助数组来执行。

但是,数组和指针之间存在一些概念上的差异。阅读本章以了解它们的差异以及比较优势和劣势。

C语言中的数组

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

声明数组,我们使用以下语法 -

data_type arr_name [size];

大小应为非负整数。例如 -

int arr[5];

数组可以在声明时初始化,其元素以逗号分隔的列表形式放在花括号内。提及其大小是可选的。

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

数组中的每个元素都具有唯一的整型索引,从“0”开始。在C语言中,数组的下界始终为“0”,上界为“size – 1”。

数组示例

以下示例显示了如何使用索引下标遍历数组 -

#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

C语言中的指针

C允许您访问编译器随机分配的变量的内存位置。取地址运算符(&)返回变量的地址。

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

为了与目标变量类型区分开来,指针的名称以星号(*)为前缀。如果我们有一个int变量,则其指针声明为“int *”

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

注意:在数组的情况下,其第0个元素的地址被分配给指针。

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

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

Pointer vs Array

因此,我们也可以写 -

int *ptr = arr;

由于数组的元素放置在相邻的内存位置,并且每个下标的地址都增加4(在int数组的情况下),因此我们也可以使用此功能来借助指针遍历数组元素。

指针示例

以下示例显示了如何使用指针遍历数组 -

#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

C语言中数组和指针的区别

下表重点介绍了数组和指针之间的重要区别 -

数组 指针
它将同类数据类型的元素存储在相邻的内存位置。 它存储变量或数组的地址
数组定义为相似数据类型的集合。 指针是一个存储另一个变量地址的变量。
可以存储的变量数量由数组的大小决定。 指针只能存储单个变量的地址。
数组的初始化可以在定义它们时完成。 指针在定义时不能初始化。
数组的性质是静态的。 指针的性质是动态的。
数组不能根据用户的需求调整大小。 指针可以在任何时候调整大小。
数组的分配在编译时完成。 指针的分配在运行时完成。
广告