【嵌入式修炼之路】- C语言第四课之一维数组

学益得线上课堂
从基础学习嵌入式
玩转智能硬件、斩获高薪offer

为什么需要数组

有的时候我们需要定义好多个同类型的变量,比如:

int a;
int b;
int c;
int d;
int e;

这样写代码语法上没有问题,但是变量个数太多,容易混淆,而且代码的可读性太差,不知道每个变量是什么意思。所以在C语言里面可以使用数组来表示同类型的多个变量。

定义数组

定义方式如下:

int a[10];

含义:数组名是a,有10个元素,每个元素都是整形。

注意:数组在定义的时候,元素个数必须是确定的,所以[]里面必须是常量而不是变量。

数组初始化

常见的初始化方法有如下几种:

int a[5] = {1, 2, 3, 4, 5};  //初始化所有数据
int a[5] = {1, 2, 3};        //初始化部分数据,未初始化的是0
int a[5];                    //不初始化,所有数据都是垃圾值
int a[] = {1, 2, 3, 4, 5};   //没有长度,编译器根据数组元素确定
int a[5] = {0};              //所有数据初始化成0

在定义数组的时候养成初始化的习惯,尤其是字符数组,保证所有数据都在可控制的范围内。

数组在内存中的存储

数组在内存中从低地址到高地址排列,即第一个元素在低地址,最后一个元素在高地址。如果是整型数组:

【嵌入式修炼之路】- C语言第四课之一维数组_第1张图片因为是整型元素,所以每个元素占了四个字节。如果是字符数组,每个元素占1个字节。但是,在内存中的排列都是从低地址到高地址。

数组名

先来看个代码:

#include 

int main()
{
    int a[5] = {1, 2, 3, 4, 5};

    printf("%p\n", a);           //地址的方式打印数组名
    printf("%p\n", &a);          //地址的方式打印数组名的地址

    printf("%p\n", a + 1);       //分别+1,看下区别
    printf("%p\n", &a + 1);
    
    return 0;
}

运行结果:

在这里插入图片描述
可以得出几个结论:

  1. 数组名就是地址,是数组首元素(第一个元素)地址;数组名也是常指针(值不能修改的指针);
  2. 数组名加一可以得到下一个元素的地址;
  3. &a是数组的地址,数值和a一样,但是含义不一样,a代表的是第一个元素,&a代表的是整个数组。

冒泡排序

最后附上冒泡排序的代码,通过这个代码可以搞懂数组的使用。

#include 

int main()
{
	int a[10] = {0};

	printf("请输入10个数字:\n");
	int i, j;
	for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		scanf("%d", &a[i]);
	}

	for (i = 0; i < sizeof(a) / sizeof(a[0]) - 1; i++)
	{
		for (j = 0; j < sizeof(a) / sizeof(a[0]) - i - 1; j++)
		{
			if (a[j] < a[j + 1])
			{
				#if 0
				int t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
				#endif
				a[j] = a[j] + a[j + 1];
				a[j + 1] = a[j] - a[j + 1];
				a[j] = a[j] - a[j + 1];
			}
		}
	}

	for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

更多视频、文章、嵌入式学习资源,微信关注 【学益得智能硬件】

【嵌入式修炼之路】- C语言第四课之一维数组_第2张图片

你可能感兴趣的:(C语言)