【C语言】数组

1. 一维数组

1.1 数组的创建

数组是一组相同类型元素的集合。数组的创建方式为:

type_t arr_name [const_n]
//type_t是指数组的元素类型
//const_n是常量表达式,用来指定数组大小

例如:

int arr1[10];
char arr2[20];
double arr3[20];

注意:数组创建,中括号[]中要给一个常量才可以,不能使用变量

1.2 数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理的初始值(初始化)。例如:

int arr1[10] = {1,2,3};      //不完全初始化,前三个元素为1,2,3,剩下的元素默认初始化为0
char arr2[5] = {'a','b'};    //不完全初始化,前两个元素为'a','b',剩下的元素默认初始化为0
char arr3[5] = 'ab';         //不完全初始化,前三个元素分别是a,b,\0,剩下的默认初始化为0
char arr4[] = 'abcdef';      //未指定常量,系统根据初始化元素的个数自动定义常量的值为7

1.3 一维数组的使用

  • 数组是使用下标来访问的,下标从0开始

  • 数组的大小可以通过计算得到,例如

    int arr[] = {1,2,3,4,5,6}
    int sz = sizeof(arr) / sizeof(arr[0])
    

1.4 一维数组的内存存储

例如:

int main()
{
	int n = 0;
	int arr[8] = {1,2,3,4,5,6,7,8};
	for (n = 0; n < 8; n++)
	{
		printf("arr[%d]=%p\n", n, &arr[n]);
	}
	return 0;
}

打印的结果为:

arr[0]=000000E293EFF7A8
arr[1]=000000E293EFF7AC
arr[2]=000000E293EFF7B0
arr[3]=000000E293EFF7B4
arr[4]=000000E293EFF7B8
arr[5]=000000E293EFF7BC
arr[6]=000000E293EFF7C0
arr[7]=000000E293EFF7C4

随着数组下标的增长,元素的地址,也在有规律的递增。由此可以得出结论:数组在内存中是连续存放的

2. 二维数组

2.1 二维数组的创建

二维数组每一行其实就是一维数组,可以说是由一维数组组成的

int arr1[3][4];
char arr2[20][12];
double arr3[20][6];

2.2 二维数组的初始化

int arr[3][4] = {1,2,3,4,5};    //不完全初始化,第一行放1,2,3,4,放不下了5自动放到第二行
int arr[3][4] = {{1.2.3},{4,5}}};     //不完全初始化,第一行前三个元素为1,2,3,第四个元素为0;第二行前两个元素为4,5,其余的为0
int arr[][4] = {{1,2,3,4},{5,6,7,8}};    //第一行初始化为1,2,3,4;第二行初始化为5,6,7,8;因为没有指定数组的行,所以其根据初始化内容自动定义行数为2

注意:二维数组初始化时,可省略行,不能省略列

2.3 二维数组的内存存储

int main()
{
	int i = 0;
	int arr[3][4] = { {1,2,3,4},{5,6,7,8} };
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("&arr[%d][%d]=%p\n", i,j, &arr[i]);
		}
	}
	return 0;c
}

打印结果为:

&arr[0][0]=0000006AE02FF888
&arr[0][1]=0000006AE02FF888
&arr[0][2]=0000006AE02FF888
&arr[0][3]=0000006AE02FF888
&arr[1][0]=0000006AE02FF898
&arr[1][1]=0000006AE02FF898
&arr[1][2]=0000006AE02FF898
&arr[1][3]=0000006AE02FF898
&arr[2][0]=0000006AE02FF8A8
&arr[2][1]=0000006AE02FF8A8
&arr[2][2]=0000006AE02FF8A8
&arr[2][3]=0000006AE02FF8A8

因此:二维数组在内存中是连续存放的

3.数组作为函数参数

往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序

void bubble_sort(int arr[], int sz)
{
	//确定冒泡排序的趟数
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int flag = 1; //假设这一趟要排序的数据已经有序
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag = 0;    //本趟排序的数据不完全有序
			}
		}
		if (flag == 1)
		{
			break;
		}
	}
}


int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}

数组传参,传的是数组首元素的地址通常情况下:数组名其实就是首元素地址但有两个例外:

  • sizeof内部放数组名,数组名表示整个数组,此时sozeof(数组名)计算的是整个数组的大小,单位是字节
  • &数组名,数组名表示整个数组。&数组名取出的是整个数组的地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值