目录
1.一维数组
1.1数组的定义
数据类型符 数组变量名[整型常量表达式]
例如: int arr[10]; //定义一个整形数组,数组名为arr,此数组包含10个整形元素
注意:
(1)数组有10个元素,但是下标从0开始,不存在数组元素arr[10]
(2)常量表达式包括常量和符号常量,例如char str[8]和float f[5+3]是合法的,但int n;
int arr2[n]或者int count=10;int arr3[count]是不合法的
这种不合法性取决于C99标准前后,在C99标准后支持了变长数组的概念,数组大小可以使用变量指定,但数组不能初始化。
(3)定义数组用到的“数组名[常量表达式]”和引用数组元素时用的“数组名[下标]”形式相同但含义不同
int arr[10];//这是定义数组,指定数组包含10个整形元素 int num=arr[6];//这里的arr[6]表示引用数组arr中下标为6的元素
1.2数组的初始化
初始化:创建数组的同时给它一些值
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//完全初始化
int arr2[10] = { 1,2,3 };//不完全初始化,剩余的元素默认初始化为0
int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };//这里没有指定数组元素个数,编译会根据初始化的内容来确定数组的元素个数
int arr4[] = { 1,2,3 };//3个元素
int arr5[10] = { 1,2,3 };//10个元素
char arr6[3] = { 'a', 'b', 'c' };//三个元素,分别为a,b,c
char arr7[10] = "abc";//十个元素,前三个为abc,后面都为\0
char arr8[] = "abc";//四个元素,前三个为abc,最后一个为\0
char arr9[] = { 'a', 'b', 'c' };//三个元素,分别为a,b,c
特别注意:打印数组的时候遇到"\0"停止,因为arr1是字符串后面自动带上"\0",打印结果不带上"\0",因为arr2的五个元素分别为f,i,n,a,l.无结束标识符,打印随机值。
1.3一维数组的程序举例
以下是两者不同方式打印数组元素的值
知识总结:
sz=sizeof(arr)/sizeof(arr[0]);//求整形数组元素个数
int* p=arr=&arr[0];//arr表示数组首元素地址,与&arr[0]等价
1.4数组越界访问
在顺序和逆序打印中因为一不小心就容易出现越界访问情况
定义数组有10个元素,下标从0开始,最后一个元素下标为9,上图打印arr[10],越界访问
程序可能会报错可能不报错,但不妨碍这种写法不对。
1.5一维数组在内存中的存储
总结:1一维数组在内存中是连续存放的
2随着数组下标的增长,地址是由低到高变化的
2.二维数组
2.1二维数组的定义
类型说明符 数组名 [常量表达式][常量表达式]
例如:int arr[3][4]//定义一个整形二维数组arr,arr为三行四列的数组
2.2二维数组的初始化
int main()
{
int arr1[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化
int arr2[3][4] = { 1,2,3,4,5 };
//不加分括号,不完全初始化,没有初始化的元素系统自动补0
//arr2可以简单理解为1 2 3 4
5 0 0 0
0 0 0 0
int arr3[3][4] = { {1,2} ,{3,4}, {5,6} };//加分括号的定义
//二维数组的行是可以省略的,但是列不能够省略
int arr4[][2]={1,2,3,4,5,6,7,8,9};
}
2.3二维数组在内存中的存储
总结:1二位数组在内存中也是连续存放的
2因为在内存中连续存放所以可以用指针的形式打印
3这也使得二维数组可以被看成一种特殊的一维数组:它的元素又是一个一维数组。例如arr[3][4],可以把arr看做一个一维数组,它有三个元素:arr[0],arr[1],arr[2]。每个元素又是一个包含4个元素的一维数组
arr[0]------------arr[0][0] arr[0][1] arr[0][2] arr[0][3]
arr[1]------------arr[1][0] arr[1][1] arr[1][2] arr[1][3]
arr[2]------------arr[2][0] arr[2][1] arr[2][2] arr[2][3]
可以把arr[0],arr[1],arr[2],arr[3]看做一维数组名
2.4二维数组的程序举例
三种打印二维数组的方式如图
3冒泡排序
#include<stdio.h>
int main()
{
int arr[10] = { 5,2,6,8,1,9,0,3,4,7 };//定义一个整形数组
int sz = sizeof(arr) / sizeof(arr[0]);//求数组个数
int i = 0;
for (i = 0; i < sz - 1; i++)//主循环确定要循环的趟数,10个元素进行9趟,所以sz-1;
{
//一趟冒泡排序要进行多少次相邻数据的比较
int j,tmp = 0;
for (j = 0; j < sz - 1 - i; j++)//10个元素第1趟比较9组相邻数,第二趟比较8组相邻数,以此类推
{
if (arr[j] > arr[j + 1])//交换数据使较大数往后排
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j+ 1] = tmp;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}