【初识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\n", sizeof(arr));
	printf("%d\n", sizeof(arr[0]));

	return 0;
}

在这里插入图片描述

2.一维数组的使用

对于数组的使用我们之前介绍了一个操作符:[ ],下标引用操作符。他其实就是用来进行数组访问的操作符。注意下标是从0开始;
比如

#include<stdio.h>
int 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

#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\n", 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\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;
			}
		}
	}
}

在这里插入图片描述

创作不易,免费给个赞赞吧~
请添加图片描述

  • 41
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 37
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值