【初识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;}}}}

创作不易,免费给个赞赞吧~