一維陣列初始化
初寫:2010.04.15, 更新日期:2020.12.20
 
撰寫:曾聖超老師
 
  • 陣列的定義:
     陣列的型態  陣列名稱 [ 陣列長度 ]

    範例:
    int num[10];
    float realnum[10];
    char eng[10];

  • 資料存入陣列的方式:

    1. 使用指派(設定給)敘述:

      • 宣告兼設值
        int num[5] = {1, 2, 3, 4, 5};
        float realnum[3] = {3.14, 1.414, 1.618};
        char eng[6] = {'a', 'b', 'c', 'd', 'e'};

      • 範例:
        #include <stdio.h>
        #include <stdlib.h>
        main()
        {
         char string1[] = "Superman";
         char string2[] = {'S','u','p','e','r','m','a','n','\0'};
         char string3[] = {83,117,112,101,114,109,97,110,0};
         printf("Array string1= %s \n",string1);
         printf("Array string2= %s \n",string2);
         printf("Array string3= %s \n",string3);
        }

      • 練習:(利用上述範例修改)
        請設定三個陣列,將你的學號、英文名字、手機號碼存入三個陣列,並 輸出至螢幕顯示!
        int sid[]=...;
        char myname[]=...;
        int phone[]=...;
        printf...


      • 透過迴圈設定(常用) 範例:將 num[100] 所有元素設為 0,程式碼如下:
        float num[100];
        for(i=0; i<100; i=i+1){
            num[i] = 0;
        }


    2. 使用 memset 函式初始化
      memset( 陣列名, 0, sizeof( 陣列 ))
      可以把一整塊的記憶體填上相同的值,
      因為陣列名稱都是指向第一個元素位址
      需 #include <mem.h> 方可使用。
      或使用相關函數 memcpy(目的, 來源, 區塊大小);
      範例:
      int array[20];
      memset(array, 0, 20 *sizeof(int));

      上述是在執行程式前,已經確定陣列大小的方式,
      但如果是要在執行階段,才決定要陣列的大小呢?
      稱為動態空間配置(或動態記憶體分配),常會使用以下函數:

      void* malloc( sizeof(datatype) );  //在heap區配置相關資料型別需要的空間大小.
      void* calloc( number, sizeof(datatype)); //將初始化記憶體內容設定為0.
      void* free( *ptr );  //釋放malloc,或calloc要到的空間, 但不能重複釋放!
      void* realloc( *ptr, size_t size ) //試著調整之前malloc或calloc指向區塊的大小.

      有興趣的同學,可自行上網查詢相關函數使用...

    3. 陣列初始化為0
      int array[100]={0};
      int array[100][100]={0};
      PS:以大括弧方式初始化,編譯器會如對static變數一樣,自動把沒初始的數值補0!
      要特別注意,括號裡那個0,不是初始化的數值喔!(Will Wang, 2010)

    4. 陣列名的指標性質(利用指標傳遞存取陣列)
      #include <stdio.h>
      main()
      {
           int a[5];
           a[2]=7;
           printf("a[2]=%d\n", a[2] );
           printf("*(a+2)=%d\n", *(a+2) );
           printf("*(2+a)=%d\n", *(2+a) );
      }
      執行上述程式碼,觀察執行結果為何?


  • 陣列在函數的傳遞方式:

    範例練習:
    #include <stdio.h>
    #include <stdlib.h>

    array_print(int v[10]) /* 試將下列藍色陣列印出的功能,寫成函數 替代 */
    {
       //...
    }
    main()
    {
       int v[10];
       int i;
       for(i=0; i<=10; i++){  /* 陣列 指派值 */
           v[i]=(i+1)*10;
       }
       for(i=0; i<=10; i++){  /* 利用迴圈印出陣列 */
           printf("v[%d]=%d\n", i, v[i]);
       }

    }
    試將上述範例完成,並執行觀察結果。



參考資料: