首页 > 编程学习 > 数组(C语言)——上

数组(C语言)——上

发布时间:2022/10/1 23:21:30

 “总有人间一两风,

填我十万八千梦”

🍑作者:小赛毛

💕文章初次日期: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进制)


加油啦,小比特~

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

 

Copyright © 2010-2022 kler.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号