数组是构造数据类型之一
一维数组 一维数组的定义
如何定义:
例子:
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]="你好"; // 此时数组中第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. 移位运算符
移动的是二进制,数据以二进制补码形式存储在内存中。
原码、补码和正整数的补码是相同的。
原码、补码、负整数补码如下:
> 右移运算符
右移运算有两种类型:
1>逻辑移位:丢弃右边,左边补0
2>算术移位:丢弃右侧,对左侧符号位求补
右移运算(算术移位)相当于除以 2
警告:对于移位运算符,不要移动负数位,这不是由标准定义的。
整数数 = 10;
数 >> -1; // 错误
3. 位运算符
& 按位与
| 按位或
^ 按位异或
[操作数必须是整数]
#
int main()
整数 num1 = 3;
整数 num2 = 5;
int = num1 & num2;
("num1 & num2 = %d\n",);
int = num1 | 数字2;
("num1 | num2 = %d\n", );
int = num1 ^ num2;
("num1 ^ num2 = %d\n", );
区分逻辑与(OR)和按位与(OR)
#
int main()
/* C语言如何表达真假?
真---->非0
假---->0
*/
整数a = 10;
整数 b = 20;
int c = a && b; //逻辑与
("%d\n",c); // 1
int 标志 = !a; // 逻辑否定
(“%d\n”,标志); // 0
0;
复合赋值运算符:
+=、-=、*=、/=、%=、>>=、