数组介绍

数组是相同数据类型元素的集合。

数组是从基础数据类型派生出来的一种数据类型。它的元素必须是int,char,double float,struct或union等数据类型,并且同一个数组下的元素数据类型必须一致。


假设我们在程序中需要5个整数元素,那么有两种分配内存的方法:

  1. 声明5个不同的变量来存储数据。
int val1=10;
int val2=20;
int val3=30;
int val4=40;
int val5=50;
  1. 声明一个数组,以单个变量名存储5个值。
int arr_num[5]={10,20,30,40,50};

数组声明

语法:
datatype array_Variable_Name[Max_Element_Count];

例如
声明一个由5个字符数据类型元素组成的数组: int arr_num[5];
int =数组元素数据类型
arr_num =数组变量或标识符
[5] =元素个数

声明一个由5个字符数据类型元素组成的数组: char arr_var[5];
char =数组元素数据类型
arr_var =数组变量或标识符
[5] =元素个数

声明一个由5个十进制数据类型元素组成的数组: float arr_var[5];
float =数组元素数据类型
arr_var =数组变量或标识符
[5] =元素个数

声明5个员工信息的结构数组:
struct employee
{
unsigned char name[20];
unsigned long int empId;
double salary;
}emp[5];

struct employee =数据类型
emp =结构变量/标识符
[5] =元素个数

数组初始化

一个声明的数组,未被初始化时,由于分配的内存位置是未知的,因此数组的元素可能是一些垃圾数据。因此,为了安全起见,最佳做法是在声明时使用零值初始化数组。

语法:

datatype array_Variable_Name[Max_Element_Count]={val1,val2,val3,…….valn};

datatype array_Variable_Name[ ]={val1,val2,val3,…….valn};

在语法1中,数组中的元素数不能超过声明的Max_Element_Count,因此
数组大小 = Max_Element_Count * sizeof(dataType)。

在语法2 中,数组中的元素数不是固定的,因此数组的大小为
数组大小 = 初始化数组元素的数量 * sizeof(dataType)。

例如:
初始化一个数组,该数组包含5个整数数据类型元素,其值分别为10、20、30、40、50。

int arr_num[5]={10,20,30,40,50};
或
int arr_num[]={10,20,30,40,50};

array_index_1

声明由5个字符元素组成的数组。

char arr_var[5]={'A','M','I','T'};

声明由5个整型元素组成的数组。

float arr_var[5]={4.34,6.88,1.00,5};

声明5个员工信息的结构体数组。

struct employee 
{
    unsigned char name[20];
    unsigned long int empId;
    double salary;
}emp[5]={"Amit",32767,75000.67,"Mayank",56544,54567.564};

数组初始化要记住的要点

  1. 数组索引始终从0开始。
    array_index_1
  2. 在数组中,元素的地址都是连续的
#include<stdio.h>
 
int main()
{
    char name[5]={'A','m','i','t'};
    int i;
    for(i=0;i<5;i++)
    {
        printf("Address of %dth index = %p\n",i,&name[i]);/*%p用于格式化输出地址*/
    }
     return 0;
}

程序输出:
Address of 0th index = 0x7ffd2696d6e0
Address of 1th index = 0x7ffd2696d6e1
Address of 2th index = 0x7ffd2696d6e2
Address of 3th index = 0x7ffd2696d6e3
Address of 4th index = 0x7ffd2696d6e4
arrayadress
你可以看到连续地址之间的差是1个字节,因为数组是char数据类型,而char数据类型的大小是1个字节;对于int和float,由于它们的内存大小,它将是4个字节。

  1. 如果已初始化的数组元素的数目<数组的Max_Element_Count ,则其余未初始化的索引将自动初始化为零。例如:int arr_num[5]={10,20};
    则数组arr_num中所有元素的值为:
  • arr_num[0] = 10;
  • arr_num[1] = 20;
  • arr_num[2] = 0;
  • arr_num[3] = 0;
  • arr_num[4] = 0;
  1. 初始化的数组元素的数量必须小于声明的数组大小
    例如:
#include<stdio.h>
 
int main()
{
    int arr[5]={10,20,30,40,50,60,10,20,30,40,50};
    int i;

    for(i=0;i<10;i++)
    {
        printf("%d, ",arr[i]);
    } 
     return 0;
} 

编译该程序时,编译器将在执行程序时显示以下警告:

warning: excess elements in array initializer
int arr[5]={10,20,30,40,50,60,10,20,30,40,50};

程序执行结果:
数组元素
从以上程序执行结果可以看出,程序前面打印的5个元素都是正确的,之后,由于数组仅为5个元素开辟了内存空间,其他后续的元素都未开辟空间,因此收到了一些垃圾值。

  1. 数组的大小等于Max_Element_Count * sizeof(dataType)
#include<stdio.h>

int main()
{
    int arr[5]={10,20,30};

    /*arr数组大小=size*sizeof(int)=5*4=20*/
    printf("数组的大小=%ld",sizeof(arr));

    return 0;
}

程序执行结果:
数组大小

下一节