数组是构造数据类型之一
- 数组: 有序数据的集合,用数组名标识
- 元素: 属同一数据类型,用数组名和下标确定
一维数组
一维数组的定义
定义方式:
举例:
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;
}
程序的输出结果是什么?