数组(C语言)——上

 “总有人间一两风,

填我十万八千梦”

🍑作者:小赛毛

💕文章初次日期:2022/10/1

目录

前言:为什么要引进数组?

1.一维数组的创建与初始化

1.1数组的创建

1.2数组的初始化

1.3一维数组的使用

1.4一维数组在内存中的存储


前言:为什么要引进数组?

比如下面我要存储一些数据:

int main()
{
	/*int a = 1;
	int b = 2;
	int c = 3;*/
}

那么问题来了,如果我想存储1~100呢?这个问题相信看完本节,各位童靴心中就会有答案了!


1.一维数组的创建与初始化

1.1数组的创建

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

什么意思呢?        

就是这个数组里面放的都是相同类型

int main()
{
	/*int a = 1;
	int b = 2;
	int c = 3;*/
	//1~100
	//数组-一组相同类型元素的集合
	//
	int arr[100] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 0 };
}

这里呢arr[100]表示存储100个元素 前面的int则表示存储的类型为int整形

数组的创建方式:

type_t        arr_nmae        [const_n];

//type_t 是指数组的元素类型

//const_n是一个常量表达式,用来指定

这个时候可能就有老铁要问了,那我在创建数组的的时候能不能用变量呢?什么意思呢?

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

 (变长数组):长度可变


1.2数组的初始化

int main()
{
	int arr[10] = {1,2,3,4};//不完全初始化
	return 0;
}

不完全初始化,只初始化一部分,其余部分默认初始化为0:

 当然有些同学呢问道,这样写可以嘛?

int main()
{
	int arr[10] = {1,2,3,4};//不完全初始化
	char ch1[] = { 'a','b','c' };
	char ch2[] = { 'a',98,'c' };

	return 0;
}

这样写也可以98对应的编码值就是b

当然数组的初始化可以不写,这里我们来看一下:

 那有老铁有要问了,那我如果不初始化呢?

不初始化,生成的就是随机值

全局变量不初始化,值为0

局部变量不初始化,值为随机值 

这是因为什么呢?

还有需要注意的一点是:

 


1.3一维数组的使用

对于数组的使用我们之前介绍了一个操作符:[] ,下标引用操作符。它其实就是数组访问的操作符

 接下来我们继续看:

int arr[100] = { 1,2,3,4,5,6 };
	printf("%d\n", sizeof(arr));

这个地方为什么打印400呢? 100个元素,每个元素是整型

 

	int arr[100] = { 1,2,3,4,5,6 };
	//printf("%d\n", sizeof(arr));//400
	//printf("%d\n", sizeof(arr[0]));//4
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数的写法

所以:

int main()
{
	int arr[100] = { 1,2,3,4,5,6 };
	//printf("%d\n", sizeof(arr));//400
	//printf("%d\n", sizeof(arr[0]));//4
	int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素个数的写法
	//				 0 1 2 3 4 5
	// 写代码来赋值1~100 
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = i + 1;
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}


1.4一维数组在内存中的存储

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\n", i, &arr[i]);
	}
	return 0;
}

 

 所以我们可以得出结论:

1.一维数组在内存中是连续存放的!

2.随着数组下标的增长,地址是由低到高变化的~

那么呢~接下来利用指针再补充一点:

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]);
    int* p = &arr[0];

    for (i = 0; i < sz; i++)
    {
        printf("&arr[%d]=%p<==>%p\n", i, &arr[i],p+i);
    }
    return 0;
}

通过以上我们可以看出一个指针在这里跳跃4个字节,那我们知道了这一点后,有了这个基础对于数组的访问就可以换一种方法了,接下来往下看: 

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]);
	int* p = &arr[0];

	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
	//for (i = 0; i < sz; i++)
	//{
	//	printf("&arr[%d]=%p<==>%p\n", i, &arr[i],p+i);
	//}
	return 0;
}

为什么会这样子呢?

最本质的原因其实就是因为数组在内存中的存储是连续的 

%p - 打印地址(16进制)

%d - 打印整数(10进制)


加油啦,小比特~

记得一键三连嗷!三连!!三连!!!

 

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赛毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值