C语言 - 数组的特性



数组是C语言中非常重要的数据结构。在C程序中使用数组可以更容易地处理大量数据。由于数组的许多特性,数组比单个变量具有许多优点。数组的大多数重要特性都源于其组成——数组是相同数据类型值的集合,并且位于连续的内存块中。

数组的特性在不同的编程语言中可能会有所不同。在C语言中,数组的主要特性如下:

  • 相同数据类型的集合
  • 连续内存分配
  • 固定大小
  • 长度取决于类型
  • 索引
  • 指针关系
  • 下界和上界
  • 多维数组
  • 复杂数据结构的实现

让我们详细讨论每个特性。

相同数据类型的集合

数组的所有元素都必须是相同的数据类型。这确保了对数据的访问和操作的一致性。

如果数组声明如下:

int arr[] = {50, 67.55, "hello", 21};

编译器会发出警告:

initialization of 'int' from 'char *' makes integer from pointer without a cast 
[-Wint-conversion]|

连续内存分配

数组的所有元素都存储在连续的内存位置,这意味着它们占据彼此相邻的内存块。这允许高效的随机访问和内存管理。

Contiguous Memory Allocation

固定大小

数组的大小在声明时是固定的,并且在程序执行期间不能更改。这意味着您需要预先知道所需的最大元素数量。在C语言中,数组的大小不能用变量来定义。

//这是允许的

#define SIZE = 10
int arr[SIZE];

//这也是允许的

const SIZE = 10;
int arr[SIZE];

//这是不允许的

int SIZE = 10;
int arr[SIZE];

//大小必须是整数。这将导致错误

float num[10.5] = {50, 55, 67, 73, 45, 21, 39, 70, 49, 51}; 

长度取决于类型

由于数组可以存储所有相同类型的元素,因此它占用的总内存取决于数据类型。

示例

#include<stdio.h>
int main() {
   int num[10] = {50, 55, 67, 73, 45, 21, 39, 70, 49, 51};
   int size = sizeof(num) / sizeof(int);
   printf("element at lower bound num[0]: %d \n", num[0]);
   printf("at upper bound: %d byte \n", num[size-1]); 
   printf("length of int array: %ld \n", sizeof(num));
   double nm[10] = {50, 55, 67, 73, 45, 21, 39, 70, 49, 51};
   size = sizeof(nm) / sizeof(double);
   printf("element at lower bound nm[0]: %f \n", nm[0]);
   printf("element at upper bound: %f \n", nm[size-1]);
   printf("byte length of double array: %ld \n", sizeof(nm));

   return 0;
}

输出

element at lower bound num[0]: 50 
at upper bound: 51 byte 
length of int array: 40 
element at lower bound nm[0]: 50.000000 
element at upper bound: 51.000000 
byte length of double array: 80

索引

数组中的每个元素都有一个唯一的索引,从0开始。可以使用方括号中包含的索引访问单个元素。通常,使用for循环遍历数组的长度,并将循环变量用作索引。

示例

#include <stdio.h>

int  main() {
   int a[] = {1,2,3,4,5};
   int i;

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

指针关系

数组的名称等效于指向其第一个元素的常量指针。这允许您在某些情况下互换使用数组名称和指针。

示例

#include <stdio.h>
int  main() {
   int num[10] = {50, 55, 67, 73, 45, 21, 39, 70, 49, 51};
   printf("num[0]: %d Address of 0th element: %d\n", num[0], &num[0]);
   printf("Address of array: %d", num);
   return 0;
}

输出

num[0]: 50 Address of 0th element: 6422000
Address of array: 6422000

下界和上界

数组中的每个元素都由一个从0开始的索引标识。数组的下界是其第一个元素的索引,始终为0。数组的最后一个元素的索引为数组大小减1。

示例

#include <stdio.h>
int  main() {
   int num[10] = {50, 55, 67, 73, 45, 21, 39, 70, 49, 51};
   int size = sizeof(num) / sizeof(int);
   printf("element at lower bound num[0]: %d at upper bound: %d Size of array: %d", 
   num[0], num[size-1], size);
   return 0;
}

输出

element at lower bound num[0]: 50 at upper bound: 51 Size of array: 10

多维数组

如果数组声明时方括号中只有一个大小值,则称为一维数组。在一维数组中,每个元素都由其索引或下标标识。在C语言中,您可以声明多个索引来模拟二维、三维或多维数组

示例

例如,以下是二维数组的示例:

int a[3][3] = { {1, 2, 3}, {11, 22, 33}, {111, 222, 333}};

您可以将一维数组视为列表,将二维数组视为表格或矩阵。理论上,数组的维数没有限制,但在实践中,二维数组用于电子表格、数据库等的設計。

复杂数据结构的实现

我们可以在结构数据类型的构造中使用数组来实现堆栈、链表和树等数据结构。

示例

typedef struct stack {
   int top;
   int arr[10];
}  Stack;

因此,数组是程序员武器库中的重要工具,因为它可以用于不同的应用程序。C语言中的数组概念被许多后续的编程语言所实现,例如C++、C#、Java等。

广告