← 返回首页
C语言系列教程(十六)
发表时间:2021-03-25 12:07:40
数组

数组就是在程序中充当容器功能的一种数据类型。

数组有三大特征: - 连续 - 大小固定 - 类型一致

1.数组的定义

a)静态分配 例如分配一个长度为5的整型数组。

#include <stdio.h>

int main() {
    int arr[5]= {1,2,3,4,5};
    for(int i=0; i<5; i++) {
        printf("%d ",arr[i]);
    }
    printf("\n数组占用字节数:%d\n",sizeof(arr));
    //c语言不会检查数组下标越界
    printf("arr第六个元素是:%d",arr[5]);
    return 0;
}

运行结果: 1 2 3 4 5 数组占用字节数:20 arr第六个元素是:0

上例采用的是静态初始化方式,对应整型数组静态初始化时元素默认值为0,由于C语言数组并没有length属性。所以,可以使用sizeof(arr)/sizeof(int)或者sizeof(arr)/sizeof(arr[0]),方式计算数组元素个数。

例如:

#include <stdio.h>

int main() {
    int arr[5]= {1};
    for(int i=0; i<5; i++) {
        printf("%d ",arr[i]);
    }
    printf("\n数组占用字节数:%d\n",sizeof(arr));
    printf("\n数组的元素个数:%d\n",sizeof(arr)/sizeof(int));
        //printf("\n数组的元素个数:%d\n",sizeof(arr)/sizeof(arr[0]));
    //c语言不会检查数组下标越界
    printf("arr第六个元素是:%d",arr[5]);
    return 0;
}

运行结果: 1 2 3 4 5 数组占用字节数:20

数组的元素个数:5 arr第六个元素是:0

静态初始化有以下三种定义方式:

//直接用数字
int arr[10];

//用宏定义define
#define MAXSIZE 10
int arr[MAXSIZE];

//用const
const int size = 10 ;
int arr[size];

静态初始化时,我们也可以不指定数组长度。并且我们使用宏定义实现一个专门用来计算数组元素个数的方法LEN.

例如:

#include <stdio.h>
#define LEN(x) sizeof(x) / sizeof(x[0])

int main() {
    int arr[]= {1,2,3,4,5,100};
    int len = LEN(arr);
    printf("%d\n",len);
    for(int i=0; i<len; i++) {
        printf("%d ",arr[i]);
    }
    printf("\n数组占用字节数:%d\n",sizeof(arr));
    printf("\n数组的元素个数:%d\n",sizeof(arr)/sizeof(arr[0]));
    //c语言不会检查数组下标越界
    printf("arr第六个元素是:%d",arr[5]);
    return 0;
}

运行结果: 6 1 2 3 4 5 100 数组占用字节数:24

数组的元素个数:6 arr第六个元素是:100

2)动态分配

使用malloc动态分配的内存在堆内存中。malloc能操作的是程序中的堆空间,而普通的数组则是存放在栈空间里面的。

例如:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* arr= (int*)malloc(5 * sizeof(int));
    for(int i=0; i<5; i++) {
        arr[i]=i+1;
        printf("%d ",arr[i]);
    }
    return 0;
}

运行结果: 1 2 3 4 5

注意:malloc只能用于指针变量,因此sizeof(arr))也不是arr指针变量指向的内存空间所占用的字节数量。sizeof(arr)仅仅是里面保存的内存地址类型所占用的字节数量。而sizeof(*arr)是指针变量类型所占用的字节大小。

在32位机下一个地址的大小是4个字节,所以跟int是一样的,在64位机下的话一个地址的大小应该就是8个字节就是long long类型。

例如:

#include <stdio.h>
#include <stdlib.h>

int main() {

    int arr1[] = {1,2,3,4,5};
    int* arr2= (int*)malloc(5 * sizeof(int));

    for(int i=0; i<5; i++) {
        arr2[i]=i+1;
        printf("%d ",arr2[i]);
    }
    printf("\n----------\n");
    printf("\n静态初始化的数组arr1占用字节数量:%d\n",sizeof(arr1));
    printf("\n指针变量arr2占用的字节数量:%d\n",sizeof(*arr2));
    printf("\n指针变量arr2指向数组第一个元素值是:%d\n",*arr2);
    printf("\n指针变量arr2里保存的地址值的数据类型占用字节数量:%d\n",sizeof(arr2));
    printf("\n指针变量arr2里保存的地址值是:%d\n",arr2);

    return 0;
}

运行结果:

1 2 3 4 5

静态初始化的数组arr1占用字节数量:20

指针变量arr2占用的字节数量:4

指针变量arr2指向数组第一个元素值是:1

指针变量arr2里保存的地址值的数据类型占用字节数量:8

指针变量arr2里保存的地址值是:1577920

2.数组的遍历

通常使用for循环实现对数组遍历。 例如:从控制台输入10个整数保存到长度为10的整型数组里并遍历输出。

#include <stdio.h>
#include <stdlib.h>
#define LENTH 10

int main() {
    int arr[LENTH];
    for(int i=0; i<LENTH; i++) {
        printf("请输入第%d个元素:",i+1);
        scanf("%d",&arr[i]);
    }
    for(int i=0; i<LENTH; i++) {
        printf("%d ",arr[i]);
    }
    return 0;
}

运行结果: 请输入第1个元素:12 请输入第2个元素:23 请输入第3个元素:45 请输入第4个元素:47 请输入第5个元素:9 请输入第6个元素:6 请输入第7个元素:11 请输入第8个元素:13 请输入第9个元素:18 请输入第10个元素:66 12 23 45 47 9 6 11 13 18 66