数组知识总结

个人感受:在我个人看来,数组的重要性是显而易见的,特别是在现在这个信息爆炸的时代,我们要想让自己的写的程序的可用性上升,那就必然离不开数组的使用,它能把具有相同类型的若干元素按无序的形式组织起来。在程序中合理地使用数组,会使程序的结构比较整齐,而且可以把较为复杂的运算,转化成简单的数组来表示,总之数组很nice

一维数组

使用规则:

  1. 可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给钱前面部分元素赋值。
  2. 只能给元素逐个赋值,不能给数组整体赋值。
    (请注意:在C,C#语言中是这样,但并非在所有涉及数组的地方都这样,数据库是从1开始)
  3. 若不给可初始化的数组赋初值,则全部元素均为0.
  4. 假如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。
    动态赋值可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。

表示方法:

数组元素是组成数组的基本单元。
数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:数组名[下标] 其中的下标只能为整型常量或整型表达式。
如为小数时,C编译将自动取整。例如,a[5],a[i+j],a[i++]都是合法的数组元素。数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量, 而不能一次引用整个数组。

一维数组的定义示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#define SIZE 5//宏定义,推荐用宏定义,方便修改
int main()
{
//变量的定义:类型名 变量名;
//数组的定义:类型名 数组名【数组元素个数】;
int a;
int arr[5];//相当于定义了5个int 型变量
//int b[a+1];//错误,不能包含变量
//int c[2.5];//错误,数组长度不能是小数
int d[SIZE];//相当于int [5]

}

一维数组的初始化示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#define SIZE 5//宏定义,推荐用宏定义,方便修改
int main()
{
//变量的定义:类型名 变量名=初值;
//数组的定义:类型名 数组名【数组元素个数】={初值1,初值2,···};
int a = 5;
int c[5] = { 90,80,74,84,84 };
//全部赋初值
//输出90:printf("%d",c[0]);
int p[5] = { 93,93 };
//部分赋初值,未赋初值的元素默认为0。
//省略长度赋初值,数组的长度(数组的元素个数)根据初值个数来决定。
int d[] = { 73,93.32,23 };//数组的元素个数为4
return 0;
}

例题:用循环输出数组a[5]={12,34,6,3,3}

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#define SIZE 5
int main()
{
int a[SIZE] = { 12,34,6,3,3 },i;
for (i = 0;i < SIZE;i++)
printf("%d ", a[i]);
return 0;
}

例题:用循环给数组a[5]赋初值,接着用循环输出a[5]的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#define SIZE 5
int main()
{
int a[SIZE],i;
for (i = 0;i < SIZE;i++)
{
printf("请输入第%d个数据:", i + 1);
scanf_s("%d", &a[i]);
}
for (i = 0;i < SIZE;i++)
printf("第%d个数据为:%d \n",i+1, a[i]);
return 0;
}

一维数组函数的运用

例题:用函数来用循环给数组a[5]赋初值,接着用循环输出a[5]的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
void input(int b[]);
void output(int c[]);
#define SIZE 5
int main()
{
int a[SIZE] = { 12,12,3,4,3 };
int i = 0;
input(a);//这里直接写数组名就好
output(a);
return 0;
}

/**
*_______________#########_______________________
*______________############_____________________
*______________#############____________________
*_____________##__###########___________________
*____________###__######_#####__________________
*____________###_#######___####_________________
*___________###__##########_####________________
*__________####__###########_####_______________
*________#####___###########__#####_____________
*_______######___###_########___#####___________
*_______#####___###___########___######_________
*______######___###__###########___######_______
*_____######___####_##############__######______
*____#######__#####################_#######_____
*____#######__##############################____
*___#######__######_#################_#######___
*___#######__######_######_#########___######___
*___#######____##__######___######_____######___
*___#######________######____#####_____#####____
*____######________#####_____#####_____####_____
*_____#####________####______#####_____###______
*______#####______;###________###______#________
*________##_______####________####______________
*/
//函数功能:对数组进行赋值
void input(int b[])
{
int i;
for (i = 0;i < SIZE;i++)
{
printf("请输入第%d个数据:", i + 1);
scanf_s("%d", &b[i]);
}
}
//函数功能:对数组进行输出
void output(int c[])
{
int i;
for (i = 0;i < SIZE;i++)
printf("第%d个数据为:%d \n", i + 1, c[i]);
}

二维数组

学习心得

在我看来,二维数组的运用跟一维数组没有本质上的区别。当我们把一维数组学好后你就会发现,他们之间的知识点都是相通的。所以我接下来对二维数组可能会简陋一点。

二维数组的赋初值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#define M 3
#define N 4
int main()
{
int a[M];//定义了数组长度为3的一维数组
int b[M][N];//定义了一个3行4列的二维数组
//全部赋初值
int a[2][3]={{10,20,30},{40,50,60}};
//按存储顺序全部赋初值
int a[2][3]={10,20,30,40,50,60};
//部分赋初值(按存储顺序)
int a[2][3]={10,20,30};
//部分赋初值(按存储顺序)
int a[2][3]={{10,20},{30}};
//省略行数赋初值
int a[][3]{{1,2,3},{4,5,6}{7,0,0}};
int x[][3]{10,20,30,40,50,60,70};
}

注意:

  1. 下标从0开始
  2. 使用部分赋初值的时候,为赋值的元素均为0.
  3. 省略行数赋初值时不能省略列数
  4. 行括号可以留空,但不能没有,跟for循环的;差不多意思
  5. 行括号间要有逗号,不能忘记

二维数组的遍历

很重要!!!!

官方背书:沿着某条搜索路线,依次对二维数组中的每个元素做一次访问

输出数组有两种方式一种是按行输出,一种是按列输出

例题:输出arr[3][4]的所有数组元素的值(按行输出)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#define M 3
#define N 4
//输出arr[3][4]的所有数组元素的值(按行输出)
int main()
{
int arr[M][N] = { {1,4,7,10},{2,5,8,11},{3,6,9,12} };
int i = 0, j = 0;
for (i = 0;i < M;i++) //行下标遍历
{
for (j = 0;j < N;j++)//列下标遍历
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}

输出arr[3][4]的所有数组元素的值(按列输出)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#define M 3
#define N 4
//输出arr[3][4]的所有数组元素的值(按列输出)
int main()
{
int arr[M][N] = { {1,4,7,10},{2,5,8,11},{3,6,9,12} };
int i = 0, j = 0;
for (j = 0;j < N;j++)//列下标遍历
{
for (i = 0;i < M;i++) //行下标遍历
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
return 0;
}

注意这两种输出方式运行后的效果是不一样的,看实际需要选用,相对来说,我更喜欢按行数输出。

二维数组通过函数的输入与输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#define M 3
#define N 4
void input(int a[][N]);
void output(int b[][N]);
//输出arr[3][4]的所有数组元素的值(按列输出)
int main(void)
{
//int arr[M][N] = { {1,4,7,10},{2,5,8,11},{3,6,9,12} };
int arr[M][N];
input(arr);
output(arr);
return 0;
}
//函数功能:对数组进行赋值
void input(int a[][N])
{
int i, j;
for (i = 0;i < M;i++) //行下标遍历
{
for (j = 0;j < N;j++)//列下标遍历
{
printf("请给第%d行第%d列的数赋值\n", i + 1, j + 1);
scanf_s("%d", &a[i][j]);
}
printf("\n");
}
}
//函数功能:对数组进行输出
void output(int b[][N])
{
int i = 0, j = 0;

for (i = 0;i < M;i++) //行下标遍历
{
for (j = 0;j < N;j++)//列下标遍历
{
printf("%d\t", b[i][j]);
}
printf("\n");
}
}

字符数组与字符串

因为字符数组它跟指针的联系非常密切,所以就不放在这个模块了。我不知道学校的书籍排版为什么改了,但我学完后觉得还是跟着指针的模块比较好。

数组,指针,函数是C语言三大难点,三大重点,考试会出答题,所以一定要彻底掌握。

加油,希望这么努力写学科知识总结可以增加我以后考研的把握,我也会一直坚持下去的。咱们顶峰相见!!