Bootstrap

一维及多维数组的创建及使用

数组是构造数据类型之一

  • 数组: 有序数据的集合,用数组名标识
  • 元素: 属同一数据类型,用数组名和下标确定

一维数组

一维数组的定义

定义方式:

 举例:

int arr[] = {1,2,3,4,5,6,7,8,9,10}; // 定义了一个可以存储10个元素的整型数组

一维数组的引用

1、数组必须先定义,后使用。
2、只能逐个引用数组元素,不能一次引用整个数组。
3、数组元素表示形式: 数组名[下标] ,下标可以是常量或整型表达式。

举例:

一维数组的初始化

1> 定义数组时给所有元素赋初值,这叫“完全初始化”。例如:

int a[5] = {1, 2, 3, 4, 5};

通过将数组元素的初值依次放在一对花括号中,如此初始化之后,a[0]=1;a[1]=2;a[2]=3;a[3]=4; a[4]=5,即从左到右依次赋给每个元素。需要注意的是,初始化时各元素间是用逗号隔开的,不是用分号。

2>可以只给一部分元素赋值,这叫“不完全初始化”。例如:

int a[5] = {1, 2};

定义的数组 a 有 5 个元素,但花括号内只提供两个初值,这表示只给前面两个元素 a[0]、a[1] 初始化,而后 面三个元素都没有被初始化。不完全初始化时,没有被初始化的元素自动为 0。

<注意>  字符数组的初始化方式比较丰富;

char arr1[5]={'H','e','l','l','o'};

char arr2[10]="hello"; // 此时数组中第6个元素的值为'\0'

char arr2[8]={'a',98};

3>如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确 定了。例如:

// int a[5] = {1, 2, 3, 4, 5}; int a[] = {1, 2, 3, 4, 5};

一维数组在内存中的储存

代码:

 我们观察输出的结果,随着数组下标的增长,元素的地址也在有规律的递增。由此可以得出结论:数组在数 组中是连续存放的。

例题:用冒泡法对10个数进行排序

 

 

解题过程如下:

 二维数组的创建和初始化

在这里插入图片描述

 

举例:

int arr[3][4]={1,2,3,4};

int arr[3][5]={{1,2},{4,5}};

int arr[][4]={{2,3},{1,2}};

二维数组的使用

二维数组的使用也是通过下标的方式。

二维数组在内存中的存储

通过结果分析,其实二维数组在内存中也是连续存储的。

 

程序举例

例1:将二维数组行列元素互换,存到另一个数组中
在这里插入图片描述

解题过程如下:

 

例2:求二维数组中最大元素值及其行列号
 

 在这里插入图片描述

 

如下解题:

操作符和表达式

1. 算术操作符

+  -  *  /  %

除了%操作符之外,其它的几个操作符可以作用于整数和浮点数

对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法

%操作符的两个操作数必须为整数,返回值为整除之后的余数

2. 移位操作符

移动的是二进制,数据在内存中以补码的形式进行保存。

正整数的原码、反码和补码相同。

 

负整数的原码、反码和补码如下 :

<< 左移操作符

移位规则:左边抛弃,右边补0

 左移操作相当于*2

>> 右移操作符

右移运算分两种:

1>逻辑移位:右边丢弃,左边用0填充

2>算术移位:右边丢弃,左边补符号位

 

右移操作(算术移位)相当于除2

警告:对于移位运算符,不要移动负数位,这个是标准未定义的。

 

 int num = 10;

num >> -1; // error

3. 位操作符

& 按位与

| 按位或

^ 按位异或

【操作数必须是整数】

#include <stdio.h>

int main()

{

int num1 = 3;

int num2 = 5;

int result1 = num1 & num2;

printf("num1 & num2 = %d\n",result1);

int result2 = num1 | num2;

printf("num1 | num2 = %d\n", result2);

int result3 = num1 ^ num2;

printf("num1 ^ num2 = %d\n", result3);

}

区分逻辑与(或)和按位与(或)

#include

int main()

{

/* C语言中如何表示真假?

真---->非0

假---->0

*/

int a = 10;

int b = 20;

int c = a && b; //逻辑与

printf("%d\n",c); // 1

int flag = !a; // 逻辑非

printf("%d\n", flag); // 0

return 0;

}

复合赋值符:

+=,-=,*=,/=,%=,>>=,<<=,&=,|=,^=

练习:

int main()

{

int i = 0, a = 0, b = 2, c = 3, d = 4;

i = a++ && ++b && d++;

// i = a++ || ++b || d++;

printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d);

return 0;

}

程序的输出结果是什么?

 

;