数组就是具有一定顺序关系的若干变量的集合。其中的每个变量,都被称为数组的元素


一维数组

    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+1a的地址差16个字节,相当于4个数组元素。因此,可以看出a代表第1行的地址,a+1代表第2             行的地址。

   4. a[0]+1a[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,退出程序。