第五章 陣列Ivor Horton

Carb_5683發表於2016-10-26

5.1陣列簡介

說明陣列的概念的及其作用的最好方法,是通過一個例子,來說明使用陣列後程式會變得非常簡單

5.1.1 不用陣列的程式

如何宣告一個陣列

資料型別 陣列名稱[長度];

C語言中的陣列初始化是有三種形式的
資料型別 陣列名稱[長度n] = {元素1,元素2…元素n};
資料型別 陣列名稱[] = {元素1,元素2…元素n};
資料型別 陣列名稱[長度n]; 陣列名稱[0] = 元素1; 陣列名稱[1] = 元素2; 陣列名稱[n] = 元素n+1;

5.1.2 什麼是陣列

  • 字串碰到了零,就意味著字串結束了,是一個標
  • 標準庫提供一個memset把字元陣列清零
  • 陣列是一組數目固定,型別相同的資料項,陣列中的資料項稱為元素。

    int numbers [10];//宣告陣列 型別名稱 陣列名[元素個數]

  • 方括號中的數字定義了要存放在陣列中的元素個數,稱為陣列維

  • 陣列有一個型別,它組合了元素的型別和陣列中的元素個數

  • 儲存在陣列中的每個資料項都用相同的名稱訪問,在上述例子中,該名稱就是numbers.可以在陣列名稱後的方括號內使用索引值,索引值是從零開始的連續的整數。0是第一個元素的索引值,注意,索引值是從0開始的,不是1.陣列元素的索引值是與第一個元素的偏移量

    存在的問題

  • 如何訪問陣列元素的值?

  • 如何訪問陣列元素???
    (1)要選擇某個元素,可以在陣列名稱後的方括號內使用索引值
    (2)在程式執行期間計算的整數表示式。該整數必須是對陣列有效的索引值。

5.13 使用陣列

  • 陣列可以由整個陣列當作函式的引數,也可以由陣列中的某個元素當作函式的引數:

(1)、整個陣列當作函式引數,即把陣列名稱傳入函式中,例如:

#include <stdio.h>
void temp(int arr[])
{
    int i;
    for (i= 0;i<5;i++)
    {
        printf("%d\n", arr[i]);
    }
}
int main()
{
    int arr[5] = { 1,2,3,4,5 };
    temp(arr);
    return 0;

}

2、陣列中的元素當作函式引數,即把陣列中的引數傳入函式中,例如:

#include <stdio.h>
void temp(int arrValue)
{
    printf("%d\n",arrValue);
}
int main()
{
    int arr[5] = { 1,2,3,4,5 };
    temp(arr[3]);
    return 0;
}

陣列作為函式引數時注意以下事項:
1、陣列名作為函式實參傳遞時,函式定義處作為接收引數的陣列型別形參既可以指定長度也可以不指定長度。
2、陣列元素作為函式實參傳遞時,陣列元素型別必須與形引數據型別一致


5.2 定址運算子 &

  • 定址運算子&輸出其運算元的記憶體地址,定址運算子&廣泛用於scanf(),定址運算子放在儲存輸入的變數名稱之前,scanf()函式就可以利用這個變數的地址
  • 把定址運算子放在變數名稱之前,函式就可以利用這個變數的地址。
  • 使用%u顯示sizeof生成的值
  • 使用新的格式說明符%p來輸出變數的地址(記憶體地址)

5.3 陣列名稱和地址

long number[4]
  • 陣列名稱*number指定了儲存資料項的記憶體區域地址*,把該地址和索引值組合起來就可以找到每一個元素
  • 宣告陣列時要給編譯器提供為陣列分配記憶體所需的所有資訊
  • 值的型別決定了每個元素需要的位元組數
  • 陣列維指定看元素的個數
  • 陣列佔用的位元組數元素個數乘以每個元素的位元組數
  • 陣列元素的地址是陣列開始的地址,加上元素的索引值乘以陣列中每個元素型別所需的位元組

5.4 陣列的初始化

  • 在大括號中指定一列初值,它們用逗號分開,並且陣列大小由列表中的初值個數來確定。
    double values[] = { 1.5, 2.5, 3.5, 4.5, 5.5 }
    此語句宣告瞭包含5個元素的陣列values,values[0]的初值是1.5
  • 整個陣列初始化為零
    double values[5] ={0.0}
  • 前三個元素用括號內的值初始化,後兩個元素初始化為0
    double values[5] ={1.5, 2.5, 3.5}

5.5 確定陣列的大小

  • sizeof 運算子可以計算指定型別的變數所佔用的位元組數,
 printf("The size of a variable of type long is %zu bytes.\n", sizeof(long));
  • sizeof運算子後的型別名稱的括號是必須的

注意

  • sizeof運算子生成size_t型別的值
  • sizeof運算子用於陣列可以

陣列的宣告

        double values[5] = {1.5, 2.5, 3.5, 4.5, 5.5 }
  • 可以用以下語句輸出這個陣列所佔用的位元組數
    printf(“The size of the array, values , is %zu bytes.\n”, sizeof values);
  • 輸出如下:
    The size of the array, values, is 40 bytes.

陣列佔用的記憶體是單個元素的位元組數乘以元素個數, 使用sizeof運算子計算陣列中元素的數目

 size_t    element_count = sizeof values/sizeof values[0];
  • 計算陣列元素的數量
size_t element_count = sizeof values/sizeof(double);

  • sizeof運算子應用於變數時不需要使用括號,但一般還是使用它們
double values[5] = {1.5, 2.5, 3.5, 4.5 , 5.5}
size_t element_count = sizeof(values)/sizeof(values[10])
printf("The size of the array is %zu bytes ", sizeof(values));
printf("and there are %u elements of %zu bytes each\n", element_count, sizeof(values)[0]));

該語句輸出如下:

The size of the arry is 40 bytes and  there are 5 elements of   8 bytes each

*在使用迴圈處理陣列

double values[5] = { 1.5, 2.5, 3.5, 4.5, 5.5 };
double sum = 0.0;
for(unsigned int i = 0; i < sizeof(values)/sizeof(values[0]) ; ++i)
sum +=values[i];
printf("The sum of the values is %.2f", sum );

這個迴圈將陣列中所有的元素加起來,使用sizeof運算子計算陣列的元素的個數

5.6 多維陣列

  • 宣告二維陣列
    float carrots[25] [50];
    以上語句宣告瞭一個陣列carrots,它包含25行50個浮點數元素。注意:每一維都放在自己的方括號中。
  • 宣告二維浮點陣列
    float number[3][5];
  • 分配給每個元素的記憶體量取決於陣列所含的變數的型別
    float number [4] [10]
    陣列元素型別float.佔4 個位元組。陣列佔用的記憶體總數4*4*10個位元組,即160個位元組

5.7 多維陣列的初始化

多維陣列的定義格式是:

資料型別 陣列名稱[常量表示式1][常量表示式2]…[常量表示式n];

二維陣列的初始化

二維陣列的初始化類似於一維陣列的初始化,區別是把每一行的初始值放在大括號{}中,再把所有行放在一對大括號中:

int number [3] [4] =      {

                                           { 10, 20, 30, 40 },
                                           { 15, 25, 35 ,45 },
                                           { 46, 48, 49, 59 }
                                    };

三維陣列的初始化
三維陣列有三級巢狀的括號;內層的括號包含每行的初始值。

int  number [2][3][4] ={
                                      {
                                           { 10, 20, 30, 40 },
                                           { 15, 25, 35 ,45 },
                                           { 46, 48, 49, 59 }
                                     },
                                     {
                                           { 10, 20, 30, 40 },
                                           { 15, 25, 35 ,45 },
                                           { 46, 48, 49, 59 }
                                    }
                                  };

如果提供的初始值個數少於行中的元素數,就必須給每一行的值加上括號。

  • 利用巢狀迴圈處理多維陣列中的所有元素,巢狀的層數就是陣列的維數
    int sum = 0;
      for( int i = 0, i < 2; ++i)
      {
          for(int j = 0, j < 3; ++j)
          {
             for(int k =0, k <4 ; ++k)
             {
                sum += number[i][j][k];
             }
          }
      }
printf("The sum of the value in the numbers array is %d.", sum);
  • 使用sizeof運算子可以確定多維陣列中每一維的元素個數
for(int i = 0, i < sizeof(numbers)/sizeof(numbers[0]) ; ++i)
{
    for(int j = 0, j < sizeof(numbers[0])/sizeof(numbers[0][0]) ; ++j)
    {
        for(int k = 0, k <sizeof(numbers[0][0]/sizeof(numbers[0][0][0]); ++k)
        {
            sum += numbers[i][j][k];
        }
    }
}

5.8變長陣列

什麼是變長陣列?
變長陣列的作用是什麼???是為了達到怎樣的目的呢?是實現什麼呢??

可以定義其長度在程式執行期間確定的陣列

size_t size = 0;
printf("Enter the  number of elements you want to store: ");
scanf("%zd", &size);
float values[size];

以上程式碼,把從鍵盤上讀取的一個值放在size中,使用size的值指定陣列的的長度。因為size_t 是用實現程式碼定義的整數型別,

還可以在執行期間確定二維或多維陣列中的任意或所有維。例如:

size_t rows = 0;
size_t columns = 0;
printf("Enter the number of rows you want to store: ");
scanf("%zd",&rows);
printf("Enter the number of columns in a row: ");
scanf("%zd",&columns);
float beans[rows][columns];
#ifdef   ___STDC_NO_VLA__
   printf("Variable  length arrays are not supported.\n");
   exit(1);
#endif

以上程式碼用於檢測編譯器是否支援變成陣列。

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

這樣定義了一個名稱為num資料型別為int二維陣列。其中第一個[3]表示第一維下標的長度,就像購物時分類存放的購物;第二個[3]表示第二維下標的長度,就像每個購物袋中的元素。
我們可以把上面的陣列看作一個3×3的矩陣,
num[0][0] = 1 num[0][1]=2 num[0][2] = 3
num[1][0] = 4 num[1][1]=5 num[0][2]
= 6
num[2][0] = 7 num[2][1]=8 num[0][2] = 9

多維陣列的初始化與一維陣列的初始化類似也是分兩種:

1、資料型別 陣列名稱[常量表示式1][常量表示式2]…[常量表示式n] = {{值1,..,值n},{值1,..,值n},…,{值1,..,值n}};
2、資料型別 陣列名稱[常量表示式1][常量表示式2]…[常量表示式n]; 陣列名稱[下標1][下標2]…[下標n] = 值;

多維陣列初始化要注意以下事項:

1、採用第一種始化時陣列宣告必須指定列的維數。因為系統會根據陣列中元素的總個數來分配空間,當知道元素總個數以及列的維數後,會直接計算出行的維數
2、採用第二種初始化時陣列宣告必須同時指定行和列的維數

現有三行三列的二維陣列int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,編寫程式實現計算對角線元素之和。

#include <stdio.h>

int main()
{
    int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
    int i, j;
    int sum = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            if (i % 2 == 0 && j % 2 == 0)
                sum += arr[i][j];
        }
    }
    sum += arr[1][1];
    printf("對角線元素之和是: %d\n",sum);
    return 0;
}

字串的長度

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main(void)
{
    char str[10]={'H','e','l','l','o','\0'}

    printf("string length : %\n",strlen(str));
return 0;
}

遍歷陣列的元素

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main (void)
{
   char str[] ="hello world";

   for(int i=0;i<11;i++)
   {
      printf("[index:%d]%c\n",i,str[i]);
   }

return 0;
}

如何在c語言中建立和使用陣列

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int  len =10;
    int  arr[len] ;//這種形式是錯的 int arr[10];

   for(int  a =0;a<len;a++)
   {
      arr[a] = 0;
   }


   for(int i =0;i<len;i++)
   {
      printf("index %d,and value is  %d\n",i,arr[i]);
   }
   return 0;
}

陣列的初始化

     int arr[] ={1,2,5,7,3,8}
     for(int  i=0;i<6;i++)
     {
          printf("%d\n",arr[i]);
      }
#include <stdio.h >
#include <stdlib.h >

int main (void)
{
    int arr[3][4];

    for(int i=0; i<3; i++)
    {
        for(int  j=0; j<4;j++)
        {
             arr[i][j] =0;
        }
     }
     for(int i=0; i< 3;i++)
     {
          for( int j =0;i<4;j++)
          {
              printf("index(%d,%d),%d\n",i,j,arr[i][j]);
          }
      }
  return 0;
}

綜合題

在一個長度為10的整型陣列裡面,儲存了班級10個學生的考試成績。要求編寫5個函式,分別實現計算考試的總分,最高分,最低分,平均分和考試成績降序排序

相關文章