数组就是具有一定顺序关系的若干变量的集合。其中的每个变量,都被称为数组的元素
一维数组
1 定义
【存储类型】 数据类型标识符[下标]
注意下标:C99可以变量,其它的必须常量或常量表达式
2 初始化
不初始化
局部数组不初始化,则数组中元素的值是不确定
全局数组不初始化,则数组中元素的值默认为0
全部初始化
部分初始化
static
默认的状况下,如果定义不初始化,数组元素值是随机值,
如果用static默认全部初始化为0
初始化为0
1.int a[10]={0}
2.memeset(a,0,sizeof(a))
3.bzero(a,sizeof(a))
3 元素引用
数组名[下标]
4 数组名
数组名是表示地址的常量,也是数组的起始位置
5 数组越界
案例:
冒泡排序
冒泡排序的排序过程如下。
(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,最终,最大的数被安置在最后一个元素位置上。
(2)对前n-1个数进行第二趟冒泡排序,最终,使次大的数被安置在第n-1个元素位置。
(3)重复上述过程,共经过n-1次冒泡排序后,排序结束。
示例代码如下:
#include <stdio.h>
#define N 10
int main(int argc,char **argv)
{
int a[N], i, j, t;
printf("Please input %d numbers\n",N);
for (i = 0; i < N; i++)
scanf("%d",&a[i]);
for (i = 0; i < N-1; i++)
for (j = 0; j < N-1-i; j++)
{
if (a[j] > a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
printf ("The array after sort:\n");
for (i = 0; i < N; i++)
printf ("%5d",a[i]);
printf("\n");
return 0;
}
选择排序
选择排序的排序过程如下。
(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换——第一次选择排序,结果最小的数被安置在第一个元素位置上。
(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换——第二次选择排序。
(3)重复上述过程,共经过n-1次排序后,排序结束。
示例代码如下:
#include <stdio.h>
#define N 10
int main(int argc,char **argv)
{
int a[N], i, j, r, t;
printf("Please input %d numbers\n",N);
for (i = 0; i < N; i++)
scanf("%d",&a[i]);
for (i = 0; i < N-1; i++)
{
r = i;
for (j = i+1; j < N; j++)
if (a[j] < a[r])
r = j;
if(r != i)
{
t = a[r];
a[r] = a[i];
a[i] = t;
}
}
printf ("the array after sort:\n");
for (i = 0; i < N; i++)
printf ("%5d",a[i]);
printf ("\n");
return 0;
}
二维数组
1 定义,初始化
【存储类型】 数据类型 标识符 【行下标】 【列下标】
a[m][n]元素第一个元素是a[0][0]最后一个元素是a[m-1][n-1]
初始化,部分初始化,行初始化省掉
2 元素引用
数组名[行标][列标]
3 存储形式
顺序存储
4 深入理解二维数组
int a[3][4]
a[0] | a[0][0] |
a[0][1] | |
a[0][2] | |
a[0][3] | |
a[1] | a[1][0] |
a[1][1] | |
a[1][2] | |
a[1][3] | |
a[2] | a[2][0] |
a[2][1] | |
a[2][2] | |
a[2][3] |
1. a是二维数组名,是地址常量。
2. a[0],a[1], a[2], a[3]实际上都是一维数组名,代表一维数组的起始地址,也都是地址常量。
3. a+1和a的地址差16个字节,相当于4个数组元素。因此,可以看出a代表第1行的地址,a+1代表第2 行的地址。
4. a[0]+1和a[0]的地址差4个字节,相当于1个数组元素。因此,a[0]+1相当于元素&a[0][1], a[1]+1相 当于元素&a[1][1],a[2]+1相当于元素&a[2][1]。
案例
有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号
int main(int argc, char *argv[])
{
int max, i, j, r, c;
int a[3][4] ={{24, 89, 2, 41}, {3, 11, 9, 1}};
max = a[0][0];
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
if (a[i][j] > max)
{
max = a[i][j];
r = i;
c = j;
}
printf("Max=%d, row=%d, column=%d\n", max, r, c);
return 0;
}
字符数组
1.定义,初始化,存储特点
【存储类型】数据类型 标识符【下标】。。。
单个字符初始化,和普通的数组相同,逐个为数组元素赋值
char ch[6] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘\0’};
2.用字符串常量进行初始化,注意这个时候最后有一个\0
char ch[6]={“abcde”};
char ch[6]=“abcde”;
char ch[]=“abcde”;
char c[5] = {“abcde”};
相当于这样的效果:char c[5] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘\0’};
字符串“abcde”,看起来只有5个字母,但字符串隐含了结束标志\0,相当于6个字母,越界 了。
案例
#include <stdio.h>
int main()
{
int i=0;
char s[20]={0};
printf(">");
while(scanf("%s",s)!=EOF)
{
printf(">");
printf("i=%d:%s\n",i,s);
i++;
}
printf("end main\n");
return 0;
}
在本程序中,scanf函数是标准IO库中的函数,IO库中有缓冲区,当通过键盘输入“how are you”时,首先是存放在C库的缓冲区中,调用一次scanf函数, “how”被取出缓冲区,存到字符数组中,剩下的“are you”字符串仍在缓冲区中,这时,可以循环调用scanf函数二次,把缓冲区中剩下的字符取走。当输入EOF时,scanf函数返回EOF,退出程序。