接上一篇:自学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——————————