C语言:数组(一)

什么是数组?

顾名思义,数组就是存储相同数据类型的一种类似于容器的东西


一维数组

一维数组的创建和初始化

  • 创建

int arr[10];

创建数组时必须定义数组元素的类型以及数组的大小。

上述代码定义了可以存储10个int 类型的数组。

数组创建时方括号中必须是常量,不能是变量。

例如下述代码

int main()
{
    int n=10;
    int arr[n];
    //error
    return 0;
}

这段代码中,n是变量不能用来创建数组,所以错误。

那有人问,用const 修饰的变量可以视为常量,可以用来创建数组码?答案是不行,虽然用const 修饰,但是它的本质啊还是变量,依然不能用来创建数组。

int main()
{
	const int n = 10;
	int arr[n];
    //error
	return 0;
}

我在VS编译器上编译这段代码后报出以下错误:


其他长见的一些常量可以用来创建数组:

  • #define 定义的常量
#define MAX 10
int main()
{
	int arr[MAX];
	return 0;
}

  •  枚举类型定义的常量
enum s
{
	n = 10
};
int main()
{
	int arr[n];
	return 0;
}

上述两种方式用来创建数组都是可以的。


  • 初始化

在创建数组后可以对其进行初始化,也可以不用初始化,这取决于个人习惯。

#define MAX 10
int main()
{
	int arr1[MAX] = { 0,1 };
	int arr2[MAX] = { 0,1,2,3,4,5,6,7,8,9 };
	return 0;
}

初始化可以进行局部初始化,例如arr1数组,也可以进行全部初始化,例如arr2。

局部初始化的数组arr1,除了前两个数之外,其他的默认为0。

没有进行初始化的数组,里面会放入随机内容。


一维数组在内存中的存储

数组在内存中是连续存放的。

我们可以创建一个数组,依次打印出数组中每个元素的地址。

#define MAX 10
#include<stdio.h>
int main()
{
	char arr[MAX];
	int i = 0;
	for (i = 0; i < MAX; i++)
	{
		printf("&arr[%d] = %p\n", i,&arr[i]);
	}
	return 0;
}

 

 定义了一个有10个char 类型的数组,每个char 类型在内存中占据1个字节,打印出每个元素的地址可以发现,彼此元素的地址之间相差1个字节,因此,数组的元素在内存中是连续存放的。


一维数组的访问

下标引用操作符访问

#define MAX 10
#include<stdio.h>
int main()
{
	int arr[MAX] = { 0,1,2,3,4,5,6,7,8,9 };
	int i = 0;
	for (i = 0; i < MAX; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

数组的下标从0开始(也就是第一个元素的下标),依次往后+1。

上述代码就遍历了一遍数组,打印出了数组的元素,运行结果如图:


地址访问

数组名是首元素的地址,我们可以以下代码来证明

#define MAX 10
#include<stdio.h>
int main()
{
	char arr[MAX];
	if (&arr[0] == arr)
	{
		printf("&arr[0]  and arr are same\n");
	}
	else
	{
		printf("&arr[0] and arr are not same\n");
	}
}

运行结果如下

 因此数组名表示数组首元素的地址。


那么如何通过地址来访问数组元素的?

#define MAX 10
#include<stdio.h>
int main()
{
	int arr[MAX] = { 0,1,2,3,4,5,6,7,8,9 };
	int i = 0;
	for (i = 0; i < MAX; i++)
	{
		printf("%d ", *(arr + i));
	}
}

数组名表示首元素的地址,而且数组元素在内存中又是连续存放的,所以让arr依次+1便可以得到数组每个元素的地址,再对地址进行解引用,就可以访问到这个元素。

运行结果如下

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

【 Stack_OverFlow 】

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

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

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

打赏作者

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

抵扣说明:

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

余额充值