您现在的位置是:首页 >技术交流 >【初识C语言】数组网站首页技术交流
【初识C语言】数组
【初识C语言】数组
一.一维数组
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
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3 };
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
2.完全初始化:就是把初始话的值的个数等于定义的的长度
#include<stdio.h>
int 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(数组名[ 符合数组长度的任意数字] = 数组长度
比如:
#include<stdio.h>
int main()
{
int arr[] = {0,1,2,3,4,5,6,7,8,9};
printf("%d
", sizeof(arr));
printf("%d
", sizeof(arr[0]));
return 0;
}
2.一维数组的使用
对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。他其实就是用来进行数组访问的操作符。注意下标是从0开始;
比如
#include<stdio.h>
int main()
{
int arr[5] = { 12,34,56,78,99 };
printf("%d
", arr[0]);
printf("%d
", arr[4]);
return 0;
}
在这里插入图片描述
我要访问arr数值中的第一个元素,那我下标为arr[ 0 ],要访问最后一个元素,那就是arr[ 4 ];
总结:
数组是使用下标来访问的,下标从0开始,最后一个元素的下标是定义的长度 - 1;
3.一维数组在内存中的存储方式
随着数组下标的增长,元素的地址也是在规律的增长·,数组在元素中是连续存放的
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int 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
", i, &arr[i]);
}
return 0;
}
二. 二维数组
1,什么是二维数组
二维数组你可以理解为构成行列的多个一维数组。
#include<stdio.h>
int 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
", 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("
");
}
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
",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;
}
}
}
}
创作不易,免费给个赞赞吧~