【初识C语言】数组
- 一.一维数组
- 1.什么是数组
- 1.一维数组的创建和初始化
- 1.数组如何创建
- 2.数组如何初始化
- 3.用sizeof来求数组的长度
- 2.一维数组的使用
- 3.一维数组在内存中的存储方式
- 二. 二维数组
- 1,什么是二维数组
- 2.二维数组的创建
- 3.二维数组的初始化
- 4.二维数组的使用
- 5.二维数组在内存中的存储
- 三,数组越界
- 四.数组作为函数参数
一.一维数组
1.什么是数组
1.什么是数组?
数组是一组相同类型元素的集合。比如说我们要定义10个整型变量(1~10),没学过数组之前咱就是一个变量定义一个数字,
int x1 = 1;int x2 = 2;int x3= 3;int x4 = 4;.....int x10 = 10;
你会发现,如果我们定义一个变量就要创建一个变量,那咱要定义个成百上千甚至更多的变量时可不得了,而且你会发现,这些的类型都是相同的,所以,咱就引入了数组的概念。还是以上面为例,如果我们要定义十个整型变量,就可以这么写
int x[10] = {1,2,3,4,5,6,7,8,9,10};
1.一维数组的创建和初始化
1.数组如何创建
元素类型 数组名 [常量表达式 ];
例子:
int arr [10];int count= 10;int arr_2[count];//用变量来表示元素个素的是变长数组//注意事项:数组创建时,在C99标准之气,[]中要给一个变量才可以,不能使用变量,只有在C99标准下支持了变长数组的概念。float arr_3[20];double arr_4[50];char arr_5[100];
2.数组如何初始化
数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值。
1.不完全初始化:
初始化的值少于定义的元素个数,未初始化后面的就自动补0
#includeint main(){int i = 0;int arr[10] = { 1,2,3 };for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;}
2.完全初始化:就是把初始话的值的个数等于定义的的长度
#includeint main(){int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10};for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;}
3.用sizeof来求数组的长度
sizeo语句是用来求数组字节的长度:
sizeof(数组名)= 整个数组的字节长度;
sizeof(数组名[ 符合数组长度的任意数字]) = 该数组的一个字节长度;
sizeof(数组名) /sizeof(数组名[ 符合数组长度的任意数字] = 数组长度
比如:
#includeint main(){int arr[] = {0,1,2,3,4,5,6,7,8,9};printf("%d\n", sizeof(arr));printf("%d\n", sizeof(arr[0]));return 0;}
2.一维数组的使用
对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。他其实就是用来进行数组访问的操作符。注意下标是从0开始;
比如
#includeint main(){int arr[5] = { 12,34,56,78,99 };printf("%d\n", arr[0]);printf("%d\n", arr[4]);return 0;}
在这里插入图片描述
我要访问arr数值中的第一个元素,那我下标为arr[ 0 ],要访问最后一个元素,那就是arr[ 4 ];
总结:
数组是使用下标来访问的,下标从0开始,最后一个元素的下标是定义的长度 – 1;
3.一维数组在内存中的存储方式
随着数组下标的增长,元素的地址也是在规律的增长·,数组在元素中是连续存放的
#define _CRT_SECURE_NO_WARNINGS 1#includeint main(){int arr[10] = { 0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("&arr[%d] = %p\n", i, &arr[i]);}return 0;}
二. 二维数组
1,什么是二维数组
二维数组你可以理解为构成行列的多个一维数组。
#includeint main(){int arr1[5] = {0,1,2,3,4,};int arr2[5] = {5,6,7,8,9};int arr3[5] = { 10,11,12,13,14 };return 0;}
用二维数组来表示元素的为位置
2.二维数组的创建
与一维数组类似,不过是后边了一个[ ]
数组名[ ][ ]
第一个[ ]表示数组的行;
第二个[ ]表示数组的列;
int arr[3][4];char arr[3][5];double arr[2][4];
3.二维数组的初始化
二维数组初始化行可以省略,列不可以省略,你想像给你一排数字,只告诉你行数根本不知道怎么排,但直到列数确是可以,不信你试试。
int main(){//数组的初始化int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} };int arr2[4][5] = { {1,2,3 }, {2, 3, 4 }, {3, 4, 5, 6, 7}, {5, 6, 7, 8, 9} };//二维数组即使初始化的了//行是可以省略的,但是列是不能省略的int arr3[][5] = { {1,2,3 }, {2, 3, 4 }, {3, 4, 5, 6, 7}, {5, 6, 7, 8, 9} };return 0;}
4.二维数组的使用
二维数组的使用也是通过下标的方式
int main()//{int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} };printf("%d\n", arr[2][3]);int i = 0;//行号for (i = 0; i < 4; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);//0 1 2 3 4}printf("\n");}return 0;
5.二维数组在内存中的存储
与一维数组一样,随着数组下标的增长,元素的地址也是在规律的增长·,二维数组元素再内存中是连续存放的
int main(){int arr[4][5] = { 0 };int i = 0;//行号for (i = 0; i < 4; i++)//{int j = 0;for (j = 0; j < 5; j++){printf("&arr[%d][%d] = %p\n",i,j, &arr[i][j]);}}return 0;}
三,数组越界
数组的下标是有范围限制的。
> 数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n -1。所以数组的下标如果小于0,或者大于n -1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,就不意味着程序是正确的,所以在写代码时,注意检查数组的越界
int main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int i = 0;//0~10//for (i = 0; i <= 10; i++)//当i = 10时,就越界访问了{printf("%d ", arr[i]);}return 0;}
四.数组作为函数参数
前面我们提到,数组名表示的数组首元素的地址,所以当数组名作为函数参数时,其实时只有首元素的地址传过去,并非时整个数组,所以你想在函数求数组长度是也是做不到的(你只有首元素的地址,也就只是求得一个首元素的字节长度!!!)所以我们要在主函数求的数组长度时,也将数组的长度作为函数参数传递过去。这点尤其重要!!!
举个例子:输入10个数字,然后用冒泡法来进行升序
int main(){void bubble_sort(int arr[10], int sz);int arr[10] = { 0 };//输入int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){scanf("%d", &arr[i]);}//排序 - 升序bubble_sort(arr,sz);//让这个函数来完成数组arr中数据的排序for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;}void bubble_sort(int*arr, int sz)//这里的arr的本质是指针{int i = 0;for (i = 0; i < sz - 1; i++){int j = 0;//一趟每部比较的对数for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){//交换int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}
创作不易,免费给个赞赞吧~