C语言一维数组的创建、初始化、清空、逆置、访问、存储

一维数组的创建和初始化

创建:

    int arr[10];

数组的初始化有三种方法:

1 直接初始化
    //代码1
    int arr[10] = { 0 };
    //代码2
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
2 for循环初始化
    void InitArr(int arr[], int sz)
    {
        for (int i = 0; i < sz; i++)
            arr[i] = i;
    }

注:上述代码中的sz是在主函数中算出来,然后传过来的,它表示数组中元素的个数,该参数不能在初始化函数中计算,因为数组穿过去的是首元素的地址,假如在初始化函数中计算,结果为1,而不是数组中元素的个数。

3 memset()函数初始化
    void InitArr(int arr[], int sz)
    {
        memset(arr, 0, 40);
    }

注:该函数的原型为

    void *memset(void *ptr, int value, size_t num)

地址ptr开始的num个字节赋值value,是逐个字节赋值,ptr开始的num个字节中的每个字节都赋值为value。后面的40为数组arr的字节。

  • 若ptr指向char型地址,value可为任意字符值;
  • 若ptr指向非char型,如int型地址,要想赋值正确,value的值只能是-1或0,因为-1和0转化成二进制后每一位都是一样的;
    假如需要赋值0~9,只能使用for循环。

一维数组的清空

数组的清空救比较简单了,就是把每个元素都变为0,可以变相理解为初始化为0。

    void EmptyArr(int arr[])
    {
        memset(arr, 0, 40);
    }

一维数组的逆置

将数组的首尾元素换位置即可
    void ReverseArr(int arr[], int sz)
    {
        for (int i = 0; i < sz / 2; i++)
        {
            int tmp = arr[i];
            arr[i] = arr[sz - 1 - i];
            arr[sz - 1 - i] = tmp;
        }
    }

注: 上述方法中需要注意的是循环到数组一半长度就必须终止,要不然就又换回去了,和原数组一样。

一维数组的访问

1 直接访问
    void PrintArr(int arr[], int sz)
    {
        for (int i = 0; i < sz; i++)
            printf("%d ", arr[i]);
    }
2 通过指针访问
    void PrintArr(int arr[], int sz)
    {
        int *p = arr;
        for (int i = 0; i < sz; i++)
            printf("%d ", *(p+i));
    }

注:上述代码将arr数组首个元素的地址赋给指针变量p,p+i表示第i个元素的地址,然后解引用*(p+i),就得到了第i个元素的数值。

一维数组的存储

    #include <stdio.h>

    int main()
    {
        int arr[10] = { 0 };
        for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
        {
            printf("&arr[%d] = %p\n", i, &arr[i]);
        }
        return 0;
    }

注:int类型占四个字节,所以一维数组在内存中是连续存放的。

主函数

    int main()
    {
        int arr[10] = { 0 };
        int sz = sizeof(arr) / sizeof(arr[0]);
        InitArr(arr, sz);
        PrintArr(arr, sz);
        printf("\n");
        ReverseArr(arr, sz);
        PrintArr(arr, sz);
        printf("\n");
        return 0;
    }

附:

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

    void InitArr(int arr[], int sz)
    {
        for (int i = 0; i < sz; i++)
            arr[i] = i;
    }

    void PrintArr(int arr[], int sz)
    {
        int *p = arr;
        for (int i = 0; i < sz; i++)
            printf("%d ", *(p+i));
    }


    void EmptyArr(int arr[], int sz)
    {
        memset(arr, -1, 40);
    }

    void ReverseArr(int arr[], int sz)
    {
        for (int i = 0; i < sz / 2; i++)
        {
            int tmp = arr[i];
            arr[i] = arr[sz - 1 - i];
            arr[sz - 1 - i] = tmp;
        }
    }

    int main()
    {
        int arr[10] = { 0 };
        int sz = sizeof(arr) / sizeof(arr[0]);
        InitArr(arr, sz);
        PrintArr(arr, sz);
        printf("\n");
        ReverseArr(arr, sz);
        PrintArr(arr, sz);
        printf("\n");
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/aixiaodeshushu/article/details/80784918