C語言數組

數組就是具有一定順序關係的若干變量的集合。其中的每個變量,都被稱爲數組的元素


一維數組

    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,退出程序。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章