[ C语言 ] 数组-- 一维数组-- 二维数组--(1)

文章目录

  • 前言
  • 一,数组
  • 二,一维数组
  • 三,二维数组





前言

本篇文章主要记录数组的相关概念

主要包括: 数组-- 一维数组-- 二维数组

———————————————————————————————————————————

                                                                    ****正文开始***

一,数组

1.1.数组的定义:

数组是一组相同类型元素的集合。

1.2为什么要引入数组

我们知道,我们创建一个变量a,将数字存放在变量a中,我们可以通过这样创建:

	int a = 10;
	int b = 20;
	int c = 30;

假设现在要创建并存放100个,甚至更多数字,我们还能一一列举创建吗,这显然工作量将变得非常巨大,这时我们就用到了一个可以储存相同类型元素的集合-->数组

二,一维数组

2.1.一维数组的创建和初始化

2.1.1数组的创建方式:

type_t   arr_name   [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

实例:

char ch[10];
int arr[5];

注意:

int n = 10;
int arr2[n];// [] 内应该为常量

c99标准之前不支持使用变量的,只能是常量!

c99中增加了变长数组的概念,允许数组的大小是变量。

而且要求编译器支持C99标准

VS 对C99的支持不够好

2.1.2 数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。

例如:

int arr[10] = { 1,2,3,4,5,6,7,8,9.10 };
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

不完全初始化: 剩余元素默认初始化为0

	int arr[10] = { 1,2,3 };
	int arr[10] = { 0 };

我们也可以用过监视来查看未被初始化的空间:

我们看以下的代码要区分,内存中如何分配,下面四个输出的结果分别是什么?

char arr1[] = { 'a','b','c' };
	printf("%d\n", sizeof(arr1));
	printf("%d\n", strlen(arr1));
char arr2[] = { "abc" };
	printf("%d\n", sizeof(arr2));
	printf("%d\n", strlen(arr2));

在代码中我们发现了用到了strlen库函数和sizeof操作符,我们先对他们俩做一个区分

strlen 和 sizeof:

*****strlen: 是一个库函数,计算的是字符串的长度,只能针对字符串   关注的是字符串是否有 '\0'
                    计算的是'\0'之前的字符的个数

*****sizeof:    sizeof 是一个操作符(运算符),sizeof 是用来计算变量所占内存空间的大小的,任何类型都是可以使用 
                   只关注空间的大小,不在乎内存中是否存在'\0'

因此我们再分析这段代码:

 我们看到 :

arr1有3个元素,数组的大小是3个字节

arr2有4个元素,数组的大小是4个字节

因此第一个打印结果将会是: 3

因此第三个打印结果将会是: 4

又因为:strlen: 是一个库函数,计算的是字符串的长度,只能针对字符串   关注的是字符串是否有 '\0',计算的是'\0'之前的字符的个数。

因此 arr1 没有字符串 所以第二个将会打印:随机值

         arr2有字符串“abc”,长度是3 所以第二个将会打印:3

我们也可以通过监视查看:

 因此我们最后看演示结果:

 2.2.一维数组的使用

  对于数组的使用我们之前介绍了
一个操作符: [ ] ,下标引用操作符。它其实就数组访问的操作符。
我们来看代码: 
#include <stdio.h>
int main()
{
	int arr[10] = { 0 };//数组的不完全初始化
	   //计算数组的元素个数
	int sz = sizeof(arr) / sizeof(arr[0]);
	//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
	int i = 0;//做下标
	for (i = 0; i < 10; i++)//这里写10,好不好?
	{
		arr[i] = i;
	}
	//输出数组的内容
	for (i = 0; i < 10; ++i)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

在这个问题解决之前我们要了解一下数组的下标

2.2.1 数组的下标

下标:下标是用来访问元素的

数组是使用下标来访问的,下标是从0开始。

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//              0 1 2 3 4 5 6 7 8  9  
数组的大小可以通过计算得到。
	int sz = sizeof(arr) / sizeof(arr[0]);
	            //    40 / 4;   计算数组的元素个数

有了对数组下标的了解,我们就可以分析上述代码

 总结:

1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。

2.3 一维数组在内存中的存储

接下来我们探讨数组在内存中的存储。

看代码:

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int *p = &arr[0];
	// 打印数组的每个元素的地址
	int i = 0;
	for (i = 0; i < 10; i++) {
		printf("&arr[%d] = %p\n", i, &arr[i]);

我们来看演示结果:

 我们发现:         int 是4个字节 

仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增。
   一维数组在内存中是连续存放的
   数组随着下标的增长,地址是由低到高变化的

三,二维数组

3.1二维数组的创建和初始化

3.1.1二维数组的创建

//数组创建
int arr[3][4]; // 表示3行4列 12个int元素
char arr[3][5]; // 表示3行5列
double arr[2][4];//表示2行4列

3.1.2二维数组的初始化

	//行和列的编号也是从0开始
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//先放满一行再到下一行

我们打印就可以看到:

 不完全初始化:

int arr[3][4] = { 1,2,3,4,5,6,7};//先放满一行再到下一行,不完全初始化 7后面都是0000

我们通过监视清晰地查看:

 如果说我们要查找第2行第3列的元素,我们可以这样写:

	printf("%d\n",arr[2][3]);// 第二行第三列的元素

我们分析对照运行结果:

如果想控制某一行地元素,我们可以这样写。

例如我们想每一行的前三3列存放数字:

int arr[3][4] = { {1,2,3},{4,5,6},{7,8,9} };

 我们依旧看监视:

 我们打印出来:

 我们发现依然得到了我们想要的结果。

3.2二维数组的使用

二维数组的使用也是通过下标的方式。
看代码:
#include <stdio.h>
int main()
{
	int arr[3][4] = { 0 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			arr[i][j] = i * 4 + j;
		}
	}
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%d ", arr[i][j]);
		}
	}
	return 0;
}

我们查看运行结果:

3.3二维数组在内存中的存储

像一维数组一样,这里我们尝试打印二维数组的每个元素。
int main() {
	int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 4; j++) {
			printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
		 
			//二维数组的存放也是连续存放的

		}
	}
	return 0;
}

我们来查看运行结果:

 通过结果我们可以分析到,其实二维数组在内存中也是连续存储的

                                                                    ****正文结束****

———————————————————————————————————————————

                                                                 




总结

本届内容主要记录了数组的简单介绍,包括了一维数组,二维数组

由于本人的技术水平还有待提高,如果各位读者在阅读过程中发现了错误,请及时指正哦。

如果大家觉得有所收获的话,麻烦点赞+关注 走一波呗 QAQ

  • 29
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
C语言中,可以使用数组查表法来查找0-16383之间的数。首先,我们可以创建一个包含16384个元素的数组,每个元素对应一个数。然后,我们可以将每个元素的值设置为对应的数。例如,数组的第一个元素的值为0,第二个元素的值为1,以此类推,直到最后一个元素的值为16383。接下来,我们可以通过输入一个数来查找它在数组中的位置。如果找到了该数,我们可以输出它在数组中的索引值,即对应的位置。如果没有找到该数,我们可以输出"not found"。以下是一个示例代码: ```c #include <stdio.h> int main() { int table\[16384\]; int target; // 创建查找表 for (int i = 0; i < 16384; i++) { table\[i\] = i; } // 输入要查找的数 printf("请输入要查找的数:"); scanf("%d", &target); // 在查找表中查找数的位置 int found = 0; for (int i = 0; i < 16384; i++) { if (table\[i\] == target) { printf("数 %d 的位置为 %d\n", target, i); found = 1; break; } } if (!found) { printf("未找到该数\n"); } return 0; } ``` 在上述代码中,我们首先创建了一个包含16384个元素的数组`table`,并将每个元素的值设置为对应的数。然后,我们通过输入一个数来查找它在数组中的位置。如果找到了该数,我们输出它在数组中的索引值;如果没有找到该数,我们输出"未找到该数"。 #### 引用[.reference_title] - *1* [C语言数组之查找](https://blog.csdn.net/m0_43450897/article/details/88827094)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言 二维数组的查找 二分查找(折半查找)、暴力搜索(暴力求解)、线性查找(从右上角出发查找、从左下...](https://blog.csdn.net/undefinedUser_1/article/details/121984410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [1242_C语言实现简单的查表](https://blog.csdn.net/grey_csdn/article/details/124851232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白又菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值