C语言-数组

本文详细讲解了C语言中的数组,包括一维数组和二维数组的创建、初始化、使用及内存存储方式。特别强调了一维数组在内存中是连续存放的,二维数组同样按行存储且地址连续。还探讨了数组作为函数参数的应用,如冒泡排序,并解析了数组名的含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章学数组

一维数组

数组是什么?数组是一组相同类型的集合

一维数组的创建和初始化

#include <stdio.h>

int main()
{
	int arr1[]={1,2,3,4,5,6,7,8,9,10};	//arr1表示数组中有10个元素
	int arr2[10];						//arr2这种定义在vs2019会报警告,未引用的局部变量
	int arr3[10]={0};					//arr3表示有10个元素,每个元素都是0
	return 0;
}

数组在创建的时候不想确定确定数组的大小是,一定要初始化

#include <stdio.h>

int main()
{
	int n=10;
	int arr[n]={0};
	return 0;
}
//这种初始化,在C99中可以使用,但是不建议
//好多编译器还不支持,比如vs2019就能编译过去

数组的[]叫做下标引用操作符,里面放常量,不能使用变量

一维数组的使用

给一维数组赋值,打印数组的每一个元素

#include <stdio.h>

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		//scanf("%d", &arr[i]);
		arr[i] = i;
	}

	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
//注意数组元素是从下标0开始的,到10-1结束
//数组大小是可以通过sizeof操作符计算的
//sizeof(arr)计算数组一共有多大字节
//sizeof(arr[0])计算数组一个有多大字节,相除得到数组元素个数

一维数组在内存中的存储

在这里插入图片描述

%p是把变量的地址用16进制打印出来
&:取地址操作符,取变量的地址
可以看到arr[0]和arr[1]的地址差值为4,相差为4个字节,后面都是相差为4个字节,可以推出一维数组的元素在内存中是连续存放的
从低地址向高地址存放
数组名是首元素的地址,可以用指针接受

在这里插入图片描述

二维数组

创建和初始化

#include <stdio.h>

int main()
{
	int arr1[3][3] = { 0 };							//三行三列的数组
	int arr2[][3] = { {1,2,3},{3,4,5},{5,6,7} };	//三行三列的数组	//行数可以省略
	int arr3[3][5] = { 1,2,3,4,5,6,7,8,9,10 };		//先把行填满,在进行下一行,剩下的元素,默认是0
	//int arr4[2][] = { {1,2,3},{4,5,6} };			这种是错误的,不能省略列数
	return 0;
}

二维数组的使用

#include <stdio.h>

int main()
{
	int arr[3][5] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			arr[i][j] = i * j;			//任意给的数据
		}
	}

	for (i = 0; i < 3; i++)			//打印数组的每一位
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

二维数组也是通过下标操作符访问的

二维数组在内存中的存放

在这里插入图片描述

可以看出二维数组在内存中也是连续排放的,第一行和第二行也是相差为4,紧接着排放的,跟一维数组一样,地址也是从低到高的

#include <stdio.h>

int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0][0];
	int i = 0;
	for (i = 0; i < 12; i++)
	{
		printf("%d ", *(p + i));
	}
	return 0;
}
//可以用指针

数组作为函数参数

冒泡排序

#include <stdio.h>

void bubble_sort(int arr[], int sz)
{
	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;
			}
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);	//数组的个数

	bubble_sort(arr, sz);	//传过去的数组是首元素的地址

	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
//给函数传参的数组,是数组的首元素地址

传地址会改变值

上面代码如果数组本身就是降序的话,还得排序,改进一下

#include <stdio.h>

void bubble_sort(int arr[], int sz)
{
	int i = 0;
	int flag = 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;
				flag = 1;
			}
		}
		if (flag == 0)	//flag值没改变,就是数组已经排序好了
			break;
	}	
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);

	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

数组名的解释

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值