数组

数组”元素个数”必须是常数或常量表达式,不能是变量,而且其值必须是正整数。元素个数称作”数组的长度”。

定义一个数组

1.T array[N]; //T可以是任何类型,如char,double,int等,N可以是一个正整数或者值为正整数的常量表达式

这里我们定义了一个数组,数组名字是array,里面存放了N个元素,每个元素都是一个类型为T的变量。这N个元素在内存里面一个挨一个连续存放。array数组占用了一片连续的,大小为N * (sizeof(T))字节的存储空间。
下标可以是任何值为整型的表达式。表达式里面可以包含变量、函数调用。下标如为小数时,编译器将自动去尾取整。

数组初始化

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

数组初始化时,

  1. {}中值的个数可以少于元素个数,此时相当于只给前面元素赋值,而后面的元素,其存储空间里的每个字节都被写入二进制数0
  2. 在定义数组时,如果全部元素赋值,则可以不给出数组元素的个数。
  3. 数组元素的下标,可以是任何整数,可以是负数,也可以大于数组元素的个数。当大于数组元素个数的时候,编译时候不会出错。
  4. 访问的数组元素并不在数组的存储空间内,这种现象叫做”数组越界”。
  5. 如果在跟踪调试程序的时候,发现某个变量变成了一个不正确的值,当想不出为什么这个变量变成该值,要考虑一下数组是如何越界的!
  6. 由于数组越界导致指令被修改,甚至会发现在调试器里调试的时候,程序将不按正常次序运行。例如,单步调试程序的时候,明明碰到一个条件为真的if语句,却就是不执行为真的那个分支!

二维数组

二维数组的每一行实际上都是一个一维数组,二维数组存放矩阵特别合适

二维数组正常赋值和打印:

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
#include<stdio.h>
#define ROW 3
#define COL 2

/*输入赋值给二维数组*/
void scanTwoDimensionArray(int *num)
{
int i,j;
for(i = 0; i < ROW; i++)
{
for(j = 0; j < COL; j++)
{
scanf("%d",&(*(num + i * ROW + j)));
}
}
}

/*二维数组按行输出*/
void printTwoDimensionArray(int *num)
{
int i,j;
for(i = 0; i < ROW; i++)
{
for(j = 0; j < COL; j++)
{
printf("%d\t",*(num + i * ROW + j));
}
printf("\n");
}
}

int main()
{
int a[ROW][COL],i,j;
scanTwoDimensionArray(a);
printTwoDimensionArray(a);
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
#include<stdio.h>
#define ROW 3
#define COL 2

void scanTwoDimensionArray(int *num)
{
int i,j;
for(i = 0; i < ROW; i++)
{
for(j = 0; j < COL; j++)
{
scanf("%d",&(*(num + i * ROW + j)));
}
}
}

/*数组按列输出*/
void printTwoDimensionArrayByCol(int *num)
{
int i,j;
for(i = 0; i < COL; i++)
{
for(j = 0; j < ROW; j++)
{
printf("%d\t",*(num + j * ROW + i));
}
}
}

int main()
{
int a[ROW][COL],i,j;
scanTwoDimensionArray(a);
printTwoDimensionArrayByCol(a);
return 0;
}