自学C语言——数组(二)

接上一篇:自学C语言——数组(一) 

6.二维数组的创建

二维数组的概念

数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。

      1                1        2        3        4        5                        1        2        3        4        5

     int              int      int       int      int      int                       2        3        4        5        6

数组元素                        一维数组                                     3        4        5        6        7

                                                                                          int      int       int      int      int

                                                                                                        二维数组

二维数组的创建 

如何定义二维数组

type arr_name[常量值1][常量值2];

例如:
int arr[3][5];
double data[2][8];

#define _CRT_SECURE_NO_WARNINGS 1
int main()
{
	int arr[3][5];//三行有五个元素

	return 0;
}
  • int 表示数组的每个元素是整型类型
  • arr是数组名,也可以自定义(data数组意思基本一致) 

7.二维数组的初始化

在创建变量或者数组的时候,给定一些初始值,被称为初始化。

二维数组的初始化和一维数组一样,也是用大括号进行初始化。

不完全初始化

int arr1[3][5] = {1,2};
int arr1[3][5] = {0};//所有元素为0

 1        2        0        0        0

 0        0        0        0        0

 0        0        0        0        0

                   arr1

完全初始化 

int arr1[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

 1        2        3        4        5

 2        3        4        5        6

 3        4        5        6        7

                   arr1

按行初始化 

int arr1[3][5] = {{1,2},{3,4},{5,6}};

 1        2        0        0        0

 3        4        0        0        0

 5        6        0        0        0

                   arr1

只能省略行,不能省略列 

int arr1[][5] = {1,2,3,4,5,6};

 1        2        3        4        5

 6        0        0        0        0

                   arr1

8.二维数组的使用

二维数组的下标

二维数组的使用是通过下标的形式,二维数组有行和列,只要锁定了行和列就能唯一锁定数组中的一个元素。

C语言规定,二维数组的行是从0开始的列,也是从0开始的。

                    0        1        2        3       4

 0                 1        2        3        4        5

 0                 2        3        4        5        6

 2                 3        4        5        6        7

 第2行,第4列,快速定位7

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
	printf("%d", arr[2][4]);

	return 0;
}

输出所有数组内容

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };

	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

 输入后输出

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

	int i = 0;
	//输入
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	//输出
	for (i = 0; i < 3; i++)
		{
			int j = 0;
			for (j = 0; j < 5; j++)
			{
				printf("%d ", arr[i][j]);
			}
			printf("\n");
		}
	
	return 0;
}

9.二维数组在内存中的存储

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

		}
	}

	return 0;
}

&arr[0][0] = 0000009B12F4F558
&arr[0][1] = 0000009B12F4F55C
&arr[0][2] = 0000009B12F4F560
&arr[0][3] = 0000009B12F4F564
&arr[0][4] = 0000009B12F4F568
&arr[1][0] = 0000009B12F4F56C
&arr[1][1] = 0000009B12F4F570
&arr[1][2] = 0000009B12F4F574
&arr[1][3] = 0000009B12F4F578
&arr[1][4] = 0000009B12F4F57C
&arr[2][0] = 0000009B12F4F580
&arr[2][1] = 0000009B12F4F584
&arr[2][2] = 0000009B12F4F588
&arr[2][3] = 0000009B12F4F58C
&arr[2][4] = 0000009B12F4F590

二维数组在内存中也是连续存放 ,如果把二维数组的一行看做一个一维数组

那么第一行这个一维数组的数组名就是:arr[0],

第二行这个一维数组的数组名就是arr[1]

10.C99中的变长数组

C语言有国际的标准,C99指1999年标准

C99中给一个边长数组(VAL)的新特性,允许我们可以使用变量指定数组大小,C99之前不支持,数组大小只能使用常量或者常量表达式。

int n = a+b;
int arr[n];

上面arr就是边长数组,它的长度取决于变量n的值,编译器没法确定,只有输入后才知道。所有边长数组不能初始化 

11.练习

多个字符从两端移动,向中间汇聚

#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[] = "Hello my computer!!!!!";
	char arr2[] = "######################";
	int left = 0;
	int right = strlen(arr1) - 1;
	printf("%s\n", arr2);
	while(left<right)
	{
		Sleep(1000);//休眠,单位毫秒
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		left++;
		right--;
		printf("%s\n", arr2);
	}
	return 0;
}

输出:
######################
H####################!
He##################!!
Hel################!!!
Hell##############!!!!
Hello############!!!!!
Hello ##########r!!!!!
Hello m########er!!!!!
Hello my######ter!!!!!
Hello my ####uter!!!!!
Hello my c##puter!!!!!
Hello my computer!!!!!
#include<string.h>
#include<stdio.h>
int main()
{
	char arr1[] = "Hello my computer!!!!!";
	char arr2[] = "######################";
	int left = 0;
	int right = strlen(arr1) - 1;
	printf("%s\n", arr2);
	while (left < right)
	{
		Sleep(1000);
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		system("cls");//在一排显示
		left++;
		right--;
		printf("%s\n", arr2);
	}
	return 0;
}
输出:
下述内容
######################
H####################!
He##################!!
Hel################!!!
Hell##############!!!!
Hello############!!!!!
Hello ##########r!!!!!
Hello m########er!!!!!
Hello my######ter!!!!!
Hello my ####uter!!!!!
Hello my c##puter!!!!!
Hello my computer!!!!!
一行一行的显示

二分查找

在一个升序的数组中查找指定的数字n,使用遍历数组效率较低,推荐使用二分查找,也算折半查找。

直接按顺序查找:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		if (arr[i] == k)
		{
			printf("找到了,下标是:%d\n", i);
			break;
		}
	}
	if (i == sz)
		printf("找不到\n");

	return 0;
}

输出:
找到了,下标是:6
#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 17;
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		if (arr[i] == k)
		{
			printf("找到了,下标是:%d\n", i);
			break;
		}
	}
	if (i == sz)
		printf("找不到\n");

	return 0;
}

输出:
找不到

 二分法:

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d", &k);
	int sz = sizeof(arr) / sizeof(arr[0]);

	int left = 0;
	int right = sz - 1;

	while (left<=right)
	{
		int mid = (left + right) / 2;//被查找范围中元素的下标

		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
		printf("找不到\n");

	return 0;
}

输出:
5
找到了,下标是:4

11
找不到

——————————End——————————

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

混迹网络的权某

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

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

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

打赏作者

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

抵扣说明:

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

余额充值