初识C语言——一维数组,二维数组

一维数组

int main()
{
	int arr[] = { 1,2,3,4,5,6,7 };
	char ch[] = { 'a','b','c','d' };
	return 0;
}

上面是两个数组,其中第一个数组有7个元素,第二个数组有4个元素。打开调试窗口,

 可以清晰地看到里面的元素。

一维数组初始化

 这是完全初始化,arr[8]={1,2,3,4,5,6,7,8},其中8个元素都赋予了初始值。

 这是不完全初始化,也就是说arr中本应该放置10个元素,但只初始化了8个,打开调试窗口,选择监视。

 可以看到,不够的元素都放置0,而ch数组放置\0,\0的ASCII值为0,'a'为97。

 如果不输入元素的个数,那么编译器会自动根据初始化的元素个数来确定元素个数。

一维数组的访问

1. 数组是有下标的,下标是从0开始的
2. [] 下标访问操作符

 其中arr[0]代表数组中的第一个元素。

 清晰的展现了元素与下标。

#include<stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8 };
	char ch[] = { 'a','b','c','d','e' };
	printf("%d ", arr[0]);
	printf("%d ", arr[1]);
	printf("%d ", arr[2]);
	printf("%d\n", arr[3]);
	printf("%c ", ch[0]);
	printf("%c\n", ch[2]);
	int i = 0;
	int j = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i <= j - 1; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

for循环实现数组的打印。

一维数组在内存中的储存

 后面分别为第一到第四个元素的地址;

 调试窗口,可以看到他们的地址。之间相差4个字节,因为是整型类型。而且每次输出的地址会不一样。

打开调试内存。

 可以看到内存中的地址和调试窗口监视中的一样。

 可以看出内存中的地址从下到上是逐渐变小的,也就是上图的高地址到低地址。arr[0]的地址为007BF884,arr[1]的地址为007BF884。均为内存单元的首位地址。

 下面一一打印所有元素的地址。

#include<stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8 };
	char ch[] = { 'a','b','c','d','e' };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	int* p = &arr[0];
	for (i = 0; i < sz; i++)
	{
		printf("%p\n", p + i);
	}
	return 0;
}

运行结果为

 二维数组

先认识一个简单的二维数组。

arr[3][4],表示三行四列,打开调试窗口监视

 可以看到每一行有四个元素。

二维数组的访问

如何锁定二维数组中的一个元素呢?可以这样理解。

 比如说要数组中的元素7,那么它的位置就是第二行第三列,坐标可以认为(1,2),而可以这样表达arr[1][2],这就锁定了这个元素。

输出所有元素

#include<stdio.h>

int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int i = 0;
	
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 二维数组的初始化

上面的arr[3][4]数组为完全初始化。下面为几种非初始化的二维数组。

 在二维数组中行数可以省略,但列数不能,确定列数和元素个数后,编辑器会自动确定行数的。上面都省略了行数。arr2[][4]中有7个元素,不够的用0补齐。

 arr2[][4]中最后一个元素为0。

 arr3的监视窗口是这样的。

 可以理解为第一行只初始化了2个元素,剩下的2个由0补齐,第二行初始化了3个元素,最后一个由0补齐。

二维数组的内存储存

#include<stdio.h>

int main()
{
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int i = 0;
	
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%p\n", &arr[i][j]);
		}
	}
	return 0;
}

元素的地址为:

 这样的地址和上面的一维数组的地址有什么相同之处呢?都是按4个字节增加的。

其实二维数组的内存分布并不像上面类似于格子分布的,也是和一维数组一样,是并排分布的,什么意思呢?

 类似于这样储存的,可以理解为行数又是一个类似于一维数组的数组。

这次的分享就到这里了,有错误或意见可以提出来。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值