一维数组,二维数组讲解加实例

目录

一维数组

一维数组的创建和初始化

 一维数组的访问

一维数组在内存中的存储

二维数组

二维数组的创建,初始化和访问

二维数组在内存中的存储

数组作为函数参数

实例1:三子棋(在主页资源中下载源代码)

实例2:扫雷游戏


一维数组

一维数组的创建和初始化

int main()
{
	int n = 3;
	//定义表达式:数组类型  数组名 [数组大小(这必须是一个常量表达式)]
	int arr[n];//其中n不是常量,语法错误
	int arr[3];//正确的格式

	int a = 5;//初始化变量a
	int arr1[6] = { 1,2,3,4 };//不完全初始化,数组元素为1,2,3,4,\0,\0(注:没有初始化的数组赋值为\0)
	int arr2[10] = {1,2,3,4,5,6,7,8,9,10};//完全初始化
	int arr3[] = {1,2,3,4,5};//数组根据初始化内容,确定数组的大小
	
	char ch[] = {'a','b','c'};//字符数组初始化
	char ch[] = { "abc"};//字符数组存放字符串,这个数组中的元素是a,b,c,\0(注:\0是字符串结束标志)
	return;
}

字符初始化需要注意的情况:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{
	char arr[3] = {'a','b','c'};
	char arr1[] = "abc";
	//输出数组字符串,只有取到\0时才会停止
	printf("%s\n",arr);//只能确定这个语句输出的前三个字符为abc,但是不会停止直到这个函数在内存中找到下一个\0才会停止
	printf("%s\n", arr1);//这个数组中是abc\0所以只会输出abc
	
	printf("%d\n",strlen(arr));//strlen()函数是求数组长度的函数
    //数组的长度还可以用sizeof(arr)/sizeof(arr[0]);//数组总长度/单个数组的长度
	printf("%d\n", strlen(arr1));
	return;
}

 一维数组的访问

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int arr[] = {0};
	int i;
	for (i = 0;i < 10; i++)
	{
		arr[i] = i + 1;//数组是从arr[0]开始的,这个数组是arr[0]到arr[9]十个数组的定义
	}
	for (i=0;i<10;i++)
	{
		printf("%d\t",arr[i]);//数组的访问
	}
	return;
}

一维数组在内存中的存储

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//%p  -是按照地址的格式打印 -十六进制打印地址
//%x  -是十六进制打印
int main()
{
	printf("%x\n",0x12);
	printf("%p\n", 0x12);
	
	int arr[10] = {0};
	int i;
	for (i = 0;i < 10; i++)
	{
		arr[i] = i + 1;//数组是从arr[0]开始的,这个数组是arr[0]到arr[9]十个数组的定义
	}
	for (i=0;i<10;i++)
	{
		printf("arr[%d]=%p\n", i,&arr[i]);//数组的访问
	}
	return;
}

运行结果:因为数组定义的是整形,所以每个数组占四个字节 


二维数组

二维数组的创建,初始化和访问

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int arr[3][4] = { {1,1,1,1},{2,2,2,2},{3,3,3,3} };//表示三行四列
	for (int i=0;i<3;i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("%d\t",arr[i][j]);
		}
		printf("\n");
	}
	
	return;
}

通过监测和运行结果来查看数组中的结构

 其他初始化方式:用于理解二维数组的内部结构(注:请结合初始化语句和旁边的监控界面查看)

二维数组在内存中的存储

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int arr[3][4] = { {1,1,1,1} ,{2,2,2,2} ,{3,3,3,3} };//表示三行四列
	for (int i=0;i<3;i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("arr[%d][%d]=%p\t",i,j,&arr[i][j]);
		}
		printf("\n");
	}
	
	return;
}

运行结果

注:可以相邻的数组之间差四个字节(差四个字节是因为数组定义为整型,整型在内存中占四个字节) 。

得出结论:与一维数组的存储方式相同


数组作为函数参数

数组名作为函数参数时是首元素地址!!!

但是有俩个例外:是sizeof(数组名)和&数组名这俩个情况是取出的整个数组的地址

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


int main()
{
	int arr[] = {10,9,8,7,6,5,4,3,2,1};
	printf("&arr[0]的首地址:%p\n",&arr[0]);
	printf(" arr[0]的首地址:%p\n", arr);
	
	printf("-------------------------------------\n");
	
	int len = sizeof(arr);
	printf("数组长度为:%d\n", len);
	
	printf("-------------------------------------\n");
	
	printf(" arr的地址:%p\n",arr);
	printf("&arr的地址:%p\n", &arr);
	//为什么说&数组名取的是整个数组的地址,但显示的和上面语句显示的一样呢?
	
	printf("-------------------------------------\n");
	
	//我们可以再来看一个对比
	printf(" arr+1的地址:%p\n", arr+1);//与之前相差4个字节
	printf("&arr+1的地址:%p\n", &arr+1);//与之前相差40个字节,而40个字节正好是我们数组的长度
	return;
}

运行结果:

 实例冒泡排序:俩俩相邻的元素进行比较,按需交换

void bubble(int arr[],int len)
{
	
	int t;
	for (int i = 0; i < len; i++)
	{
		for (int j = i+1; j < 10; j++)
		{
			if (arr[i] > arr[j])
			{
				t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
		}
	}
	
}


int main()
{
	int arr[] = {10,9,8,7,6,5,4,3,2,1,11};
	int len = sizeof(arr) / sizeof(arr[0]);
	//确定数组长度,用于冒泡次数
	bubble(arr,len);
	for (int i = 0; i < len; i++)
	{
		printf("%d\t",arr[i]);
	}
	return;
}

实例1:三子棋(在主页资源中下载源代码)

实例2:扫雷游戏

~更新中

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值