第五章數(shù)組的概念

5.1數(shù)組簡介

說明數(shù)組的概念的及其作用的最好方法,是通過一個例子,來說明使用數(shù)組后程序會變得非常簡單

5.1.1 不用數(shù)組的程序

如何聲明一個數(shù)組
數(shù)據(jù)類型 數(shù)組名稱[長度];

  • C語言中的數(shù)組初始化是有三種形式的
    數(shù)據(jù)類型 數(shù)組名稱[長度n] = {元素1,元素2…元素n};
    數(shù)據(jù)類型 數(shù)組名稱[] = {元素1,元素2…元素n};
    數(shù)據(jù)類型 數(shù)組名稱[長度n]; 數(shù)組名稱[0] = 元素1; 數(shù)組名稱[1] = 元素2; 數(shù)組名稱[n] = 元素n+1;

5.1.2 什么是數(shù)組

  • 字符串碰到了零,就意味著字符串結(jié)束了,是一個標(biāo)
    標(biāo)準(zhǔn)庫提供一個memset把字符數(shù)組清零
  • 數(shù)組是一組數(shù)目固定,類型相同的數(shù)據(jù)項(xiàng),數(shù)組中的數(shù)據(jù)項(xiàng)稱為元素。
    int numbers [10];//聲明數(shù)組 類型名稱 數(shù)組名[元素個數(shù)]
  • 方括號中的數(shù)字定義了要存放在數(shù)組中的元素個數(shù),稱為數(shù)組維
  • 數(shù)組有一個類型,它組合了元素的類型和數(shù)組中的元素個數(shù)
  • 存儲在數(shù)組中的每個數(shù)據(jù)項(xiàng)都用相同的名稱訪問,在上述例子中,該名稱就是numbers.可以在數(shù)組名稱后的方括號內(nèi)使用索引值,索引值是從零開始的連續(xù)的整數(shù)。0是第一個元素的索引值,注意,索引值是從0開始的,不是1.數(shù)組元素的索引值是與第一個元素的偏移量

存在的問題

  1. 如何訪問數(shù)組元素的值?

  2. 如何訪問數(shù)組元素???
    (1)要選擇某個元素,可以在數(shù)組名稱后的方括號內(nèi)使用索引值
    (2)在程序執(zhí)行期間計(jì)算的整數(shù)表達(dá)式。該整數(shù)必須是對數(shù)組有效的索引值。

5.13 使用數(shù)組

  • 數(shù)組可以由整個數(shù)組當(dāng)作函數(shù)的參數(shù),也可以由數(shù)組中的某個元素當(dāng)作函數(shù)的參數(shù):
    1、整個數(shù)組當(dāng)作函數(shù)參數(shù),即把數(shù)組名稱傳入函數(shù)中,例如:

    2、數(shù)組中的元素當(dāng)作函數(shù)參數(shù),即把數(shù)組中的參數(shù)傳入函數(shù)中,例如:

    數(shù)組作為函數(shù)參數(shù)時注意以下事項(xiàng):
    1、數(shù)組名作為函數(shù)實(shí)參傳遞時,函數(shù)定義處作為接收參數(shù)的數(shù)組類型形參既可以指定長度也可以不指定長度。
    2、數(shù)組元素作為函數(shù)實(shí)參傳遞時,數(shù)組元素類型必須與形參數(shù)據(jù)類型一致。

5.2 尋址運(yùn)算符 &

  • 尋址運(yùn)算符&輸出其操作數(shù)的內(nèi)存地址,尋址運(yùn)算符&廣泛用于scanf(),尋址運(yùn)算符放在存儲輸入的變量名稱之前,scanf()函數(shù)就可以利用這個變量的地址
    把尋址運(yùn)算符放在變量名稱之前,函數(shù)就可以利用這個變量的地址。
  • 使用%u顯示sizeof生成的值
    使用新的格式說明符%p來輸出變量的地址(內(nèi)存地址)

5.3 數(shù)組名稱和地址

long number[4]

數(shù)組名稱number指定了存儲數(shù)據(jù)項(xiàng)的內(nèi)存區(qū)域地址,把該地址和索引值組合起來就可以找到每一個元素
聲明數(shù)組時要給編譯器提供為數(shù)組分配內(nèi)存所需的所有信息。

  • 值的類型決定了每個元素需要的字節(jié)數(shù)
    數(shù)組維指定看元素的個數(shù)
  • 數(shù)組占用的字節(jié)數(shù)是元素個數(shù)乘以每個元素的字節(jié)數(shù)
  • 數(shù)組元素的地址是數(shù)組開始的地址,加上元素的索引值乘以數(shù)組中每個元素類型所需的字節(jié)

5.4 數(shù)組的初始化

  • 在大括號中指定一列初值,它們用逗號分開,并且數(shù)組大小由列表中的初值個數(shù)來確定。
    double values[] = { 1.5, 2.5, 3.5, 4.5, 5.5 }
    此語句聲明了包含5個元素的數(shù)組values,values[0]的初值是1.5
  • 整個數(shù)組初始化為零
    double values[5] ={0.0}
  • 前三個元素用括號內(nèi)的值初始化,后兩個元素初始化為0
    double values[5] ={1.5, 2.5, 3.5}

5.5 確定數(shù)組的大小

  • sizeof 運(yùn)算符可以計(jì)算指定類型的變量所占用的字節(jié)數(shù),
 printf("The size of a variable of type long is %zu bytes.\n", sizeof(long));
  • sizeof運(yùn)算符后的類型名稱的括號是必須的
  • 注意:
    sizeof運(yùn)算符生成size_t類型的值
  • sizeof運(yùn)算符用于數(shù)組可以
  • 數(shù)組的聲明
        double values[5] = {1.5, 2.5, 3.5, 4.5, 5.5 }
  • 可以用以下語句輸出這個數(shù)組所占用的字節(jié)數(shù)
    printf("The size of the array, values , is %zu bytes.\n", sizeof values);
  • 輸出如下:
    The size of the array, values, is 40 bytes.

*數(shù)組占用的內(nèi)存是單個元素的字節(jié)數(shù)乘以元素個數(shù), 使用sizeof運(yùn)算符計(jì)算數(shù)組中元素的數(shù)目

 size_t    element_count = sizeof values/sizeof values[0];
  • 計(jì)算數(shù)組元素的數(shù)量
size_t element_count = sizeof values/sizeof(double);

  • sizeof運(yùn)算符應(yīng)用于變量時不需要使用括號,但一般還是使用它們
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

*在使用循環(huán)處理數(shù)組

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 );

這個循環(huán)將數(shù)組中所有的元素加起來,使用sizeof運(yùn)算符計(jì)算數(shù)組的元素的個數(shù)

5.6 多維數(shù)組

  • 聲明二維數(shù)組
    float carrots[25] [50];
    以上語句聲明了一個數(shù)組carrots,它包含25行50個浮點(diǎn)數(shù)元素。注意:每一維都放在自己的方括號中。
  • 聲明二維浮點(diǎn)數(shù)組
    float number[3][5];
  • 分配給每個元素的內(nèi)存量取決于數(shù)組所含的變量的類型
    float number [4] [10]
    數(shù)組元素類型float.占4 個字節(jié)。數(shù)組占用的內(nèi)存總數(shù)4410個字節(jié),即160個字節(jié)

5.7 多維數(shù)組的初始化

多維數(shù)組的定義格式是:

數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n];

二維數(shù)組的初始化

二維數(shù)組的初始化類似于一維數(shù)組的初始化,區(qū)別是把每一行的初始值放在大括號{}中,再把所有行放在一對大括號中:

int number [3] [4] =      {

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

三維數(shù)組的初始化
三維數(shù)組有三級嵌套的括號;內(nèi)層的括號包含每行的初始值。

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 }
                                    }
                                  };

如果提供的初始值個數(shù)少于行中的元素?cái)?shù),就必須給每一行的值加上括號。

  • 利用嵌套循環(huán)處理多維數(shù)組中的所有元素,嵌套的層數(shù)就是數(shù)組的維數(shù)
    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運(yùn)算符可以確定多維數(shù)組中每一維的元素個數(shù)
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變長數(shù)組

什么是變長數(shù)組?
變長數(shù)組的作用是什么???是為了達(dá)到怎樣的目的呢?是實(shí)現(xiàn)什么呢??

可以定義其長度在程序運(yùn)行期間確定的數(shù)組

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

以上代碼,把從鍵盤上讀取的一個值放在size中,使用size的值指定數(shù)組的的長度。因?yàn)閟ize_t 是用實(shí)現(xiàn)代碼定義的整數(shù)類型,

還可以在執(zhí)行期間確定二維或多維數(shù)組中的任意或所有維。例如:

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

以上代碼用于檢測編譯器是否支持變成數(shù)組。

例如:

這樣定義了一個名稱為num,數(shù)據(jù)類型為int二維數(shù)組。其中第一個[3]表示第一維下標(biāo)的長度,就像購物時分類存放的購物;第二個[3]表示第二維下標(biāo)的長度,就像每個購物袋中的元素。
我們可以把上面的數(shù)組看作一個3×3的矩陣,
如下圖:

多維數(shù)組的初始化與一維數(shù)組的初始化類似也是分兩種:

1、數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
2、數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n]; 數(shù)組名稱[下標(biāo)1][下標(biāo)2]...[下標(biāo)n] = 值;

多維數(shù)組初始化要注意以下事項(xiàng):

1、采用第一種始化時數(shù)組聲明必須指定列的維數(shù)。因?yàn)橄到y(tǒng)會根據(jù)數(shù)組中元素的總個數(shù)來分配空間,當(dāng)知道元素總個數(shù)以及列的維數(shù)后,會直接計(jì)算出行的維數(shù)
2、采用第二種初始化時數(shù)組聲明必須同時指定行和列的維數(shù)

現(xiàn)有三行三列的二維數(shù)組int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,編寫程序?qū)崿F(xiàn)計(jì)算對角線元素之和。

Paste_Image.png
#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語言中創(chuàng)建和使用數(shù)組

#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;
}

數(shù)組的初始化

     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的整型數(shù)組里面,保存了班級10個學(xué)生的考試成績。要求編寫5個函數(shù),分別實(shí)現(xiàn)計(jì)算考試的總分,最高分,最低分,平均分和考試成績降序排序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評論 19 139
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,615評論 3 44
  • 基本面分析&策略 以安倍晉三為代表的日本政府,將在今日公布28萬億日元的具體使用細(xì)節(jié),但需要注意的是,內(nèi)閣尚未批準(zhǔn)...
    3fa7d660244e閱讀 168評論 0 0
  • 說起東野圭吾的作品,最初接觸的是神探伽里略,伽里略里印象最深的則是x容疑者的現(xiàn)身。那部作品我每次是看一邊哭一邊,最...
    任小菲閱讀 386評論 0 1
  • 當(dāng)我趕到醫(yī)院時,小姐妹小艾正在輸液,蒼白的床單和被子襯得她原本蒼白的臉更加沒有血色,她嘴唇烏青,緊緊裹住被子,瘦小...
    萬伊刀閱讀 395評論 0 0

友情鏈接更多精彩內(nèi)容