C语言从入门到精通第11天(数组的基本操作)

数组的概念

在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式集合在一起,这些按序排列的同类数据元素的集合称为数组。

在C语言中,数组属于构造数据类型,一个数组可以分解为多个数组数组元素,这些数组的元素可以是基本数据类型或构造数据类型。因此按数组元素的类型不同,数组可分为数值数组、字符数组、指针数组、结构数组等各种类别。

注:
1)数组中的元素的内存地址是连续的
2)同一个数组所有的成员都是相同的数据类型

一维数组

1) 语法

数据类型 数组名[常量表达式]

  • 数组名的命名规范必须满足“标识符的命名规范”
  • 方括号中的常量表达式就是数组的长度,也就是数组中存储元素的个数

例如:

int a[10]:说明数组是整型数组,有10个元素。
float b[10],c[20]:说明数组是实型数组,数组b,有10个元素;数组c,有20个元素。
char ch[20]:说明数组是字符数数组,包含20个元素。

2) 一维数组的初始化
定义一个数组时,需要进行初始化的操作,如果不进行初始化,则数组的内容为随机值。给数组的赋值除了用赋值语句对数组元素逐个赋值外,还可以采用初始化赋值和动态赋值(这里涉及到指针,后面会进行讲解)的方法。

  • 逐个赋值法代码如下:
int main(){
    // 定义一个数组,不进行初始化
    int a[5];
    a[0] = 1;
    a[1] = 2;
    a[3] = 3;
    a[4] = 4;
    return 0;
}
  • 初始化赋值法代码如下:
int main() {
    // 定义一个数组,同时初始化所有成员变量
    int a[6] = {1, 2, 3, 4, 5, 6};

    // 初始化前三个成员,后面的所有元素都设置为0
    int b[6] = {1, 2, 3};

    // 所有的成员设置为0
    int c[6] = {0};

    // []中不定义元素个数,定义时必须初始化
    int d[] = {1, 2, 3, 4, 5};

    // 如果数组定义元素个数,如果不进行初始化,内容为随机值
    int e[3];

    // 输出为 0 0
    // 并没有进行初始化
    printf("%d %d",e[1],e[2]);
    
    return 0;
}

3) 使用下标访问数组中的元素

  • 下标的值必须为整型常量/变量
  • 下标的值从0开始到【数组长度(定义的数组常量)-1】结束

注: 如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行的结果时未知的。

代码如下:

int main(){
    // 定义一个数组,不进行初始化
    int a[5] = {1,2,3,4,5};
    
    // 对数组中的元素
    for(int i = 0;i<5;i++){
		printf("%d",a[i]);
	}
	
    // 最后一个元素的下标为4
    // 此时我们取出超过数组长度的值
    printf("%d",a[5]); // 输出  32758
    return 0;
}


下面我们来看以下这张图就知道为什么我们会输出这个值:

在这里插入图片描述
由此图可以看出我们内存是由高地址到地址进行排列,并且在内存中每个位置都有可能存储着相应的值,这是未知的。所以当我们取的值超出了数组范围,此时会调用我们内存中的未知值,所以输出了32758。

二维数组

1)语法

数组类型 数组名[常量表达式1][常量表达式2]

  • 我们可以将二维数组当作一个有行有列的二维矩阵
  • 常量表达式1代表矩阵的行数
  • 常量表达式2代表矩阵的列数
  • 二维数组可以理解为由”常量表达式1“个一维数组组成的

例如:

int a[3][4]:可以表示为一个3行4列的二维数组,数组中的元素类型为int类型。

2)二维数组的初始化
二维数组的初始化跟一维数组的初始化相差不大,并且他的存储方式跟一维数组的存储方式是一样的,他的赋值方法也有逐个赋值和初始化赋值。

  • 逐个赋值代码如下:
int main(){
    // 定义一个二维数组,不进行初始化
    int a[2][2];
    a[0][0] = 1;
    a[0][1] = 2;
    a[1][0] = 3;
    a[1][1] = 4;
    
    return 0;
}

  • 初始化赋值代码如下:
int main(){
    // 定义一个二维数组,进行分段赋值
    int a[2][2] = {{1,2},{3,4}};

    // 连续赋值,这里根据数组定义的行列进行自动分配
    int b[2][2] = {1,2,3,4};

    // 部分赋值,只给部分
    // 行列不够,用0来凑
    int c[3][3] = {1,2,3};

    // 输出第3行3列的元素
    printf("Output position 3 hang 3 lie: %d",c[2][2]);
    
    // 0值初始化
    int d[2][2] = {0};
    
    // 不指定行数
    // 此时会根据数组的列数进行自动计算行
    int e[][2] = {1,2,3,4};
    
    // 需要注意的是不能不指定列数
    // 如果不指定列数,那么数组就不能确定到底是有多少列
    // 他的情况就有很多种
    // 不指定将无法进行初始化,程序会报错
    // int f[3][] = {1,3,3,43,4,};
    
    return 0;
}

3)使用下标进行数组元素的访问

  • 行列下标的值必须为整型常量/变量
  • 列下标的值从0开始到【数组长度(定义的数组常量)-1】结束
  • 行下标的值从0开始到【数组长度(定义的数组常量)-1】结束

注: 如果使用的下标值大于或者等于数组长度,程序仍然可以编译通过,但是运行的结果时未知的。

代码如下:

int main() {
    // 定义一个2行2列的二维数组
    int a[2][2] = {{1, 2},{3, 4}};

	// 访问第3行第1个元素
    printf("%d",a[2][0]);  // 98564384
    return 0;
}

他的取值方式跟一维数组的操作方式实际上是差不多的,也是超出了数组的长度,程序不会报错,但是返回的值是未知的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProgramStack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值