Cprogramming 简明教程

C - Properties of Array

数组是 C 中一个非常重要的数据结构。在 C 程序中使用数组可以更轻松地处理大量数据。由于它们的许多属性,数组比单一变量有许多优点。数组的大部分重要属性都是其组成的结果——数组是相同 data type 值的集合,位于连续的内存块中。

数组属性可能会在不同的编程语言中发生变化。在 C 编程语言中,以下是数组的主要属性:

  1. 相同数据类型的集合

  2. Contiguous Memory Allocation

  3. Fixed Size

  4. Length Depends on Type

  5. Indexing

  6. Pointer Relationship

  7. Lower and Upper Bounds

  8. Multi-dimensional Array

  9. 复杂数据结构的实现

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

Collection of Same Data Type

array 的所有元素必须具有相同的数据类型。这确保了对数据的始终如一地访问和操作。

如果将数组声明如下 −

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

编译器会发出警告 −

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

Contiguous Memory Allocation

数组的所有元素存储在连续的内存位置中,这意味着它们相互占用一个内存块。这允许进行有效的随机访问和内存管理。

contiguous memory allocation

Fixed Size

数组的大小在声明时确定,并且在程序执行期间不能更改。这意味着你需要事先知道所需的元素最大数量。在 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};

Length Depends on Type

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

Example

#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

Indexing

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

Example

#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;
}

Pointer Relationship

数组的名称等同于其第一个元素的常量 pointer 。这让你可以在某些上下文中互换使用数组名和指针。

Example

#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

Lower and Upper Bounds

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

Example

#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

Multi-dimensional Array

数组用方括号中的一个大小值声明,称为一维数组。在一维数组中,每个元素都由其索引或下标标识。在 C 中,你可以使用更多索引来模拟二维、三维或 multidimensional array

Example

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

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

你可以将一维数组视为列表,将二维数组视为表格或矩阵。理论上,数组的维度数量没有限制,但实际上,二维数组用于设计电子表格、数据库等。

Implementation of Complex Data Structures

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

Example

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

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