天天看點

C語言【數組】從入門到精通

🦕c語言數組知識架構圖:

C語言【數組】從入門到精通
C語言【數組】從入門到精通

文章目錄

  • ​​🐷數組​​
  • ​​🐸1.一維數組的建立與初始化​​
  • ​​🐺數組的建立:​​
  • ​​🐶2.一維數組的使用​​
  • ​​🦮一維數組的定義​​
  • ​​🐟一維數組的引用​​
  • ​​🦖3.一維數組在記憶體中的儲存​​
  • ​​🐇4.二維數組的建立​​
  • ​​🐔5.二維數組的初始化​​
  • ​​🦀6.二維數組的使用​​
  • ​​🐲二維數組在記憶體中的儲存​​
  • ​​🙈7.數組作為函數參數​​
  • ​​🦄數組元素作函數實參​​
  • ​​🐧數組名作為函數參數​​

🐷數組

C 語言支援數組資料結構,它可以存儲一個固定大小的相同類型元素的順序集合。數組是用來存儲一系列資料,但它往往被認為是一系列相同類型的變量。

數組的聲明并不是聲明一個個單獨的變量,比如 runoob0、runoob1、…、runoob99,而是聲明一個數組變量,比如 runoob,然後使用 runoob[0]、runoob[1]、…、runoob[99] 來代表一個個單獨的變量。

所有的數組都是由連續的記憶體位置組成。最低的位址對應第一個元素,最高的位址對應最後一個元素。

C語言【數組】從入門到精通

數組中的特定元素可以通過索引通路,第一個索引值為 0。

C語言【數組】從入門到精通
C語言【數組】從入門到精通

🐸1.一維數組的建立與初始化

🐺數組的建立:

數組是一組相同類型的元素的集合,

格式:type_t arr_name [const_n]
//格式:type_t  arr_name[const_n];
  //type_t  是指數組元素類型
  //const_n  是一個常量表達式,用來指定數組的大小      
int main() 
{
  //建立一個數組-存放十個整型-資料
  int arr[10] = {1,2,3,5};//不完全初始化,剩下的元素預設初始化為0
  char ch[5] = {'a','b'};
  char ch1[5] = "ab";
  char ch2[] = "abcdef";//未指定數組大小,必須進行初始化,他會根據初始化内容給數組指定大小
  printf("%d\n", sizeof(ch2));//7
  //size 計算ch2所占空間的大小
  printf("%d\n", strlen(ch2));//6
  //strlen 求字元串長度 遇到\0停止  ,且\0不計入字元串長度
  return 0
  }      

注:

1.strlen和sizeof沒有什麼關聯

2.strlen 是求字元串長度的-隻能針對于字元長長度 - 庫函數 -使用得引頭檔案

3.sizeof 計算變量,數組,類型的大小 - 機關是位元組 - 操作符

初始化 時:大括号 { } 之間的值的數目不能大于我們在數組聲明時在方括号 [ ] 中指定的元素數目。如果您省略掉了數組的大小,數組的大小則為初始化時元素的個數。

🐶2.一維數組的使用

對于數組的使用,操作符: [ ] ,下标引用操作符,間接通路數組的操作符。

🦮一維數組的定義

一維數組的定義方式

在C語言中使用數組必須先進行定義。一維數組的定義方式為:

類型說明符 數組名 [常量表達式];

其中,類型說明符是任一種基本資料類型或構造資料類型。數組名是使用者定義的數組辨別符。方括号中的常量表達式表示資料元素的個數,也稱為數組的長度。例如:

int a[10];  /* 說明整型數組a,有10個元素 */
float b[10], c[20];  /* 說明實型數組b,有10個元素,實型數組c,有20個元素 */
char ch[20];  /* 說明字元數組ch,有20個元素 */      

對于數組類型說明應注意以下幾點:

  • 數組的類型實際上是指數組元素的取值類型。對于同一個數組,其所有元素的資料類型都是相同的。
  • 數組名的書寫規則應符合辨別符的書寫規定。
  • 數組名不能與其它變量名相同。
  • 方括号中常量表達式表示數組元素的個數,如a[5]表示數組a有5個元素。但是其下标從0開始計算。是以5個元素分别為a[0], a[1], a[2], a[3], a[4]。
  • 不能在方括号中用變量來表示元素的個數,但是可以是符号常數或常量表達式。
  • 允許在同一個類型說明中,說明多個數組和多個變量。

🐟一維數組的引用

數組元素是組成數組的基本單元。數組元素也是一種變量, 其辨別方法為數組名後跟一個下标。下标表示了元素在數組中的順序号。數組元素的一般形式為:

數組名[下标]

其中下标隻能為整型常量或整型表達式。

數組元素通常也稱為下标變量。必須先定義數組,才能使用下标變量。在C語言中隻能逐個地使用下标變量,而不能一次引用整個數組。

列印數組,下标通路:

C語言【數組】從入門到精通

總結:

1.數組是使用下表來通路的,下标是從0開始的

2. 數組的大小可以通過計算得到

int sz = sizeof(arr)/sizeof(arr[0]);      

🦖3.一維數組在記憶體中的儲存

先看代碼:

int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,0};
  int sz = sizeof(arr)/sizeof(arr[0]);
  for (int i = 0; i < sz; i++) {
    printf("&arr[%d]=%p\n",i, &arr[i]);//列印位址用%p
  }
  return 0;
}      
C語言【數組】從入門到精通

上面的資料類型是int型,一個資料在記憶體中開辟4個位元組,又因為16進制是由1,2,3,4,5,6,7,8,9,a,b,c,d,e,f組成

由此不難看出,随着數組下标的增長,元素的位址,也在有規律的變化,是以得出==數組在記憶體中是連續存放的==

🐇4.二維數組的建立

數組建立:

二維數組定義的一般形式是:

dataType arrayName [length1][length2];

其中,dataType 為資料類型,arrayName 為數組名,length1 為第一維下标的長度,length2 為第二維下标的長度。

我們可以将二維數組看做一個 Excel 表格,有行有列,length1 表示行數,length2 表示列數,要在二維數組中定位某個元素,必須同時指明行和列。

int arr1[3][4];//三行四列
  char arr2[3][5];
  double arr3[3][4];      

例,arr1定義了一個 3 行 4 列的二維數組,共有 3×4=12 個元素,數組名為 arr1,即:

a[0][0], a[0][1], a[0][2], a[0][3]

a[1][0], a[1][1], a[1][2], a[1][3]

a[2][0], a[2][1], a[2][2], a[2][3]

在C語言中,二維數組是按行排列的。也就是先存放 a[0] 行,再存放 a[1] 行,最後存放 a[2] 行;每行中的 4 個元素也是依次存放。數組 arr1 為 int 類型,每個元素占用 4 個位元組,整個數組共占用 4×(3×4)=48 個位元組。

🐔5.二維數組的初始化

二維數組的初始化可以按行分段指派,也可按行連續指派。

int arr4[3][4] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12} };
int arr5[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}      

這兩種賦初值的結果是完全相同的。

對于二維數組的初始化還要注意以下幾點:

  • 可以隻對部分元素指派,未指派的元素自動取“零”值。
  • 如果對全部元素指派,那麼第一維的長度可以不給出。
  • 二維數組可以看作是由一維數組嵌套而成的;如果一個數組的每個元素又是一個數組,那麼它就是二維數組。當然,前提是各個元素的類型必須相同。

🦀6.二維數組的使用

二維數組依舊是利用下标通路!!!

int arr4[3][4] = { {1,2,3},{4,5,} };
  //  1  2  3  0
  //  4  5  0  0
  //  0  0  0  0
  int i = 0;
    for (i = 0; i < 3; i++) {
      int j = 0;
      for (j = 0; j < 4; j++) {
        printf("%d", arr4[i][j]);
      }
      printf("\n");
    }      
C語言【數組】從入門到精通

列印位址:

C語言【數組】從入門到精通

🐲二維數組在記憶體中的儲存

二維數組在邏輯(表現形式)上可了解為矩陣形式(分行分列),但其實體存儲形式卻是連續的,即存完第一行,在其後面接着存儲第二行,第三行,…,如無特殊說明,本書中涉及對二維數組的表述一般指的是其邏輯形式即矩陣形式。

C語言【數組】從入門到精通

🙈7.數組作為函數參數

數組用作函數參數有兩種形式,一種是把數組元素(下标變量)作為實參使用;另一種是把數組名作為函數的形參和實參使用。 數組元素就是下标變量,它與普通變量并無差別。 是以它作為函數實參使用與普通變量是完全相同的,在發生函數調用時,把作為實參的數組元素的值傳送給形參,實作單向的值傳送。

🦄數組元素作函數實參

🐧數組名作為函數參數

  1. 用數組元素作實參時,隻要數組類型和函數的形參變量的類型一緻,那麼作為下标變量的數組元素的類型也和函數形參變量的類型是一緻的。是以,并不要求函數的形參也是下标變量。換句話說,對數組元素的處理是按普通變量對待的。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明确的數組說明。當形參和實參二者不一緻時,即會發生錯誤。
  2. 在普通變量或下标變量作函數參數時,形參變量和實參變量是由編譯系統配置設定的兩個不同的記憶體單元。在函數調用時發生的值傳送是把實參變量的值賦予形參變量。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組并不存在,編譯系統不為形參數組配置設定記憶體。那麼,資料的傳送是如何實作的呢?在我們曾介紹過,數組名就是數組的首位址。是以在數組名作函數參數時所進行的傳送隻是位址的傳送,也就是說把實參數組的首位址賦予形參數組名。形參數組名取得該首位址之後,也就等于有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段記憶體空間。

    上圖說明了這種情形。圖中設a為實參數組,類型為整型。a占有以2000為首位址的一塊記憶體區。b為形參數組名。當發生函數調用時,進行位址傳送,把實參數組a的首位址傳送給形參數組名b,于是b也取得該位址2000。于是a,b兩數組共同占有以2000為首位址的一段連續記憶體單元。從圖中還可以看出a和b下标相同的元素實際上也占相同的兩個記憶體單元(整型數組每個元素占二位元組)。例如a[0]和b[0]都占用2000和2001單元,當然a[0]等于b[0]。類推則有a[i]等于b[i]。

繼續閱讀