【C语言】数组

数组

数组的创建

数组是一组相同类型元素的集合

type_t arr_name  [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小
int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int arr2[100] = {0};
	
}

C99变长数组(创建数组时)

int n = 10;
int arr[n];// C99允许数组的大小用变量来指定,如果编译器不支持C99中的变长数组,那就不能使用。
//vs2019不支持变长数组

变长数组不可初始化

数组的初始化

在创建数组的同时给数组的内容一些合理初始值(初始化)。

数组在创建的时候如果想不指定数组大小就得初始化。数组的元素个数根据初始化的内容来确定。

不初始化就是随机值。

在这里插入图片描述

栈上创建的变量,如果不初始化,是随机值。

静态区不初始化值为0。

int arr1[10] = {1,2,3};//不完全初始化,后面是0
//以下两种形式都一样
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};

区分:

//字符数组未初始化就是\0
char arr1[] = "abc";// a b c \0
char arr2[3] = {'a','b','c'}; // a b c 

访问数组

[],下标引用操作符

arr[4]// arr,4是[]的两个操作数
int arr[100] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
			//400          4
//循环初始化
int i = 0;
for(i = 0;i < sz;i++)
{
	arr[i] = i + 1;
}

一维数组在内存中的存储

int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	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;

在这里插入图片描述
在这里插入图片描述

二维数组的创建和初始化

二维数组的创建

int arr[3][5];
chra ch[5][7];

二维数组的初始化

int a

在这里插入图片描述

二维数组的使用

也一样,下标访问即可

利用行列锁定元素

在这里插入图片描述

int arr2[][5] = {{1,2},{4,5},{5,6}};//行能省略,但是列不可省略
int i = 0;
	//3可以用**sizeof(arr2)/sizeof(arr2[0])**;代替 整个除第一行大小s
for(i=0;i<3;i++)//0 1 2
{
	int j = 0;
	//5可以用**sizeof(arr2[0])/sizeof(arr2[0][0])**;代替 第一行除第一行第一列的元素
	for(j = 0;j <5; j++)//0 1 2 3 4
	{
		printf("%d ",arr2[i][j]);//打印的是一行
	}
		printf("\n");
}

在这里插入图片描述

实际 二维数组在内存中也是连续存放的。

列能知道一行有几个元素,能怎么放元素

在这里插入图片描述
在这里插入图片描述

可以把二维数组看作一维数组的组合,按照区分

在这里插入图片描述

数组越界

数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1
所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的
所以程序员写代码时,最好
自己做越界的检查。

二维数组的行和列也可能存在越界。

数组作为函数参数

冒泡排序

数组中两个相邻的元素进行比较,如果不满足顺序就交换。
在这里插入图片描述

10个数要跑9趟

n个数要跑n-1趟

每一趟里面也在递减元素个数

在这里插入图片描述

没排序

在这里插入图片描述

  1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
    组。
  2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。

除以上两种情况,数组名是数组首元素地址.

在这里插入图片描述

&数组名 直接跨一个数组

在这里插入图片描述

数组传参,写成数组更加容易理解,虽然本质是指针
在这里插入图片描述

void Bubble_sort(int arr[],int sz)
{
	
	int i = 0;
	int flag = 1;
	for (i = 0; i < sz - 1; ++i)//走多少趟
	{
		//每一趟冒泡排序的过程
		int j = 0;
		for (j = 0; j < sz-i-1; ++j)//10 跑9 9跑8
		{
			flag = 0;
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (1 == flag)
		{
			break;
		}
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值