C语言:初识数组及数组的复制

什么是数组?数组是由相同类型(记住是相同,不同类型不可以)的一系列数据组成。基本上C语言变量可用的类型,在数组也可使用。

数组的语法如下:

类型 数组标识[长度] ,其中数组的长度或元素个数用方括号括起。如:int arr1[10],声明了10个元素的数组。

  • 数组的初始化用花括号把数据括起来,每个数据以逗号分隔。如:int arr1[5] = {1,2,3,4,5}。其中 {1,2,3,4,5}为初始化列表
  • 数组要赋值或使用,需要通过数组的下标(索引)的方式,且数组的下标是从0开始到数组长度减1结束。如:printf("%d\n", arr1[0]); 就是打印数组arr1的第1个元素,arr1[4]就是数组的第5个元素。C语言编译器不会检查数组下标是否正确,如果不正确的数组下标就会出现下标越界,会导致程序异常退出。如:arr1[-1]、arr1[6]等,因为这个下标不存在。
  • 数组所占用的字节为:数组类型的所占用的字节大小 * 数组元素个数。如上面arr1长度为5的数组它所占用的字节为:sizeof(int) * 5 = 20Byte
  • 数组整体是不能被赋值的(即使长度、类型相同也不可以),如把 int arr1[5] 赋值给 int arr2[5]
  • 数组之间可通过两种方法实现复制:1、利用循环把每个元素赋值给另一个数组元素;2、利用memory.h头文件声明的memcpy函数进行复制。

来段代码:

#include <stdio.h>
#include <memory.h> //使用了memcpy函数,因此导入相关的头文件
/*
时间:2022-04-10 15:48
作者:sgbl888
功能:学习一维数组
知识点:
    1、数组下标从0开始,要注意下标越界问题(编译器不会检查是否越界,若越界会导致程序异常退出)
    2、数组使用前须初始化,否则可能是垃圾值,会导致计算结果不正确
    3、数组不能整体赋值(即使长度、类型相同也不可以)
    4、数组复制可使用memcpy函数(引入memory.h头文件)或使用循环逐个赋值
    5、整个数组所占用的字节大小 = 单个数组元素所占用的字节 x 数组元素个数
    6、初始化列表只能在声明时使用,不能在赋值时使用
*/
#define MONTHS 12 //一年12个月
int main(){
    //声明指定长度的数组
    //int year[MONTHS] = {1,2,3,4,5,6}; //初始化列表只给6个元素值,后面6个元素值由编译器填充为0
    int year[MONTHS] = {1,[1]=2,3,4,5,6}; //c99标准支持指定给下标的元素赋值
    //year = {2,3,4,5,6}; //错误的,不能使用初始化列表进行赋值
    int i;
    for(i = 0; i < MONTHS; i++){ //下标从0开始,因此i初始值设置为0
        printf("%d \t", year[i]); 
    }
    printf("\n-----------------------\n");

    //根据初始化列表,自动设置数组大小的数组
    char y [] = {}; //并非是空数组,等同于 int y[] = {0},只有一个元素的数组
    char x [] = {1,3,5,7,9}; //数组x大小为5,从0-4
    printf("%d\n", y[0]);
    printf("\n-----------------------\n");

    //数组整体赋值演示
    char a1[5];
    //a1 = x; //错误,不能整体赋值,虽然数组大小、类型相同也是不可以的
    
    //下标越界演示
    //printf("%d\n", a1[6]); //这两种都是错误的,因为数组下标从0开始到长度-1。
    //printf("%d\n", a1[-1]);

    //数组所占用的字节计算
    printf("\nyear数组所占用的字节为:%d Byte\n", sizeof(int) * MONTHS); //因为有12个元素,int类型占用4字节。结果为48个字节
    printf("\n-----------------------\n");

    //数组整体复制的两种方法:循环赋值、memcpy函数
    for(i = 0; i < 5; i++){
        a1[i] = x[i]; //把x的第i个元素赋值给a1的第i个元素
        printf("%d\n", a1[i]); //打印是否成功
    }
    printf("\n-----------------------\n");
    
    //使用memcpy函数复制数组
    char a2[5];
    memcpy(a2, a1, sizeof a1); //第一个参数为目标数组,第二个参数为原始数组,第三个参数为要复制的字节数(非数组个数)
    printf("%d\n", a2[2]); //打印出5,说明复制成功

    return 0;
}

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值