11-C語(yǔ)言數(shù)組-指趣學(xué)院

數(shù)組的基本概念

  • 數(shù)組,從字面上看,就是一組數(shù)據(jù)的意思,沒(méi)錯(cuò),數(shù)組就是用來(lái)存儲(chǔ)一組數(shù)據(jù)的

    • 在C語(yǔ)言中,數(shù)組屬于構(gòu)造數(shù)據(jù)類(lèi)型
  • 數(shù)組的幾個(gè)名詞

    • 數(shù)組:一組相同數(shù)據(jù)類(lèi)型數(shù)據(jù)的有序的集合
    • 數(shù)組元素: 構(gòu)成數(shù)組的每一個(gè)數(shù)據(jù)。
    • 數(shù)組的下標(biāo): 數(shù)組元素位置的索引(從0開(kāi)始)
  • 數(shù)組的應(yīng)用場(chǎng)景

    • 一個(gè)int類(lèi)型的變量能保存一個(gè)人的年齡,如果想保存整個(gè)班的年齡呢?
      • 第一種方法是定義很多個(gè)int類(lèi)型的變量來(lái)存儲(chǔ)
      • 第二種方法是只需要定義一個(gè)int類(lèi)型的數(shù)組來(lái)存儲(chǔ)
#include <stdio.h>

int main(int argc, const char * argv[]) {
    /*
    // 需求: 保存2個(gè)人的分?jǐn)?shù)
    int score1 = 99;
    int score2 = 60;
    
    // 需求: 保存全班同學(xué)的分?jǐn)?shù)(130人)
    int score3 = 78;
    int score4 = 68;
    ...
    int score130 = 88;
    */
    // 數(shù)組: 如果需要保存`一組``相同類(lèi)型`的數(shù)據(jù), 就可以定義一個(gè)數(shù)組來(lái)保存
    // 只要定義好一個(gè)數(shù)組, 數(shù)組內(nèi)部會(huì)給每一塊小的存儲(chǔ)空間一個(gè)編號(hào), 這個(gè)編號(hào)我們稱(chēng)之為 索引, 索引從0開(kāi)始
    // 1.定義一個(gè)可以保存3個(gè)int類(lèi)型的數(shù)組
    int scores[3];
    
    // 2.通過(guò)數(shù)組的下標(biāo)往數(shù)組中存放數(shù)據(jù)
    scores[0] = 998;
    scores[1] = 123;
    scores[2] = 567;
   
    // 3.通過(guò)數(shù)組的下標(biāo)從數(shù)組中取出存放的數(shù)據(jù)
    printf("%i\n", scores[0]);
    printf("%i\n", scores[1]);
    printf("%i\n", scores[2]);
    return 0;
}

定義數(shù)組

  • 元素類(lèi)型 數(shù)組名[元素個(gè)數(shù)];
// int 元素類(lèi)型
// ages 數(shù)組名稱(chēng)
// [10] 元素個(gè)數(shù)
int ages[10];

初始化數(shù)組

  • 定義的同時(shí)初始化
  • 指定元素個(gè)數(shù),完全初始化
    • 其中在{ }中的各數(shù)據(jù)值即為各元素的初值,各值之間用逗號(hào)間隔
int ages[3] = {4, 6, 9};
  • 不指定元素個(gè)數(shù),完全初始化
    • 根據(jù)大括號(hào)中的元素的個(gè)數(shù)來(lái)確定數(shù)組的元素個(gè)數(shù)
int nums[] = {1,2,3,5,6};
  • 指定元素個(gè)數(shù),部分初始化
    • 沒(méi)有顯式初始化的元素,那么系統(tǒng)會(huì)自動(dòng)將其初始化為0
int nums[10] = {1,2};
  • 指定元素個(gè)數(shù),部分初始化
int nums[5] = {[4] = 3,[1] = 2};
  • 不指定元素個(gè)數(shù),部分初始化
int nums[] = {[4] = 3};
  • 先定義后初始化
int nums[3];
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
  • 沒(méi)有初始化會(huì)怎樣?
    • 如果定義數(shù)組后,沒(méi)有初始化,數(shù)組中是有值的,是隨機(jī)的垃圾數(shù),所以如果想要正確使用數(shù)組應(yīng)該要進(jìn)行初始化。
int nums[5];
printf("%d\n", nums[0]);
printf("%d\n", nums[1]);
printf("%d\n", nums[2]);
printf("%d\n", nums[3]);
printf("%d\n", nums[4]);
輸出結(jié)果:
0
0
1606416312
0
1606416414
  • 注意點(diǎn):
  • 使用數(shù)組時(shí)不能超出數(shù)組的索引范圍使用, 索引從0開(kāi)始, 到元素個(gè)數(shù)-1結(jié)束
  • 使用數(shù)組時(shí)不要隨意使用未初始化的元素, 有可能是一個(gè)隨機(jī)值
  • 對(duì)于數(shù)組來(lái)說(shuō), 只能在定義的同時(shí)初始化多個(gè)值, 不能先定義再初始化多個(gè)值
int ages[3];
ages = {4, 6, 9}; // 報(bào)錯(cuò)

數(shù)組的使用

  • 通過(guò)下標(biāo)(索引)訪(fǎng)問(wèn):
// 找到下標(biāo)為0的元素, 賦值為10
ages[0]=10;
// 取出下標(biāo)為2的元素保存的值
int a = ages[2];
printf("a = %d", a);

數(shù)組的遍歷

  • 數(shù)組的遍歷:遍歷的意思就是有序地查看數(shù)組的每一個(gè)元素
    int ages[4] = {19, 22, 33, 13};
    for (int i = 0; i < 4; i++) {
        printf("ages[%d] = %d\n", i, ages[i]);
    }

數(shù)組長(zhǎng)度計(jì)算方法

  • 因?yàn)閿?shù)組在內(nèi)存中占用的字節(jié)數(shù)取決于其存儲(chǔ)的數(shù)據(jù)類(lèi)型和數(shù)據(jù)的個(gè)數(shù)
    • 數(shù)組所占用存儲(chǔ)空間 = 一個(gè)元素所占用存儲(chǔ)空間 * 元素個(gè)數(shù)(數(shù)組長(zhǎng)度)
  • 所以計(jì)算數(shù)組長(zhǎng)度可以使用如下方法
    數(shù)組的長(zhǎng)度 = 數(shù)組占用的總字節(jié)數(shù) / 數(shù)組元素占用的字節(jié)數(shù)
    int ages[4] = {19, 22, 33, 13};
    int length =  sizeof(ages)/sizeof(int);
    printf("length = %d", length);
輸出結(jié)果: 4

練習(xí)

  • 正序輸出(遍歷)數(shù)組
    int ages[4] = {19, 22, 33, 13};
    for (int i = 0; i < 4; i++) {
        printf("ages[%d] = %d\n", i, ages[i]);
    }
  • 逆序輸出(遍歷)數(shù)組
    int ages[4] = {19, 22, 33, 13};
    for (int i = 3; i >=0; i--) {
        printf("ages[%d] = %d\n", i, ages[i]);
    }
  • 從鍵盤(pán)輸入數(shù)組長(zhǎng)度,構(gòu)建一個(gè)數(shù)組,然后再通過(guò)for循環(huán)從鍵 盤(pán)接收數(shù)字給數(shù)組初始化。并使用for循環(huán)輸出查看

數(shù)組內(nèi)部存儲(chǔ)細(xì)節(jié)

  • 存儲(chǔ)方式:

    • 1)內(nèi)存尋址從大到小, 從高地址開(kāi)辟一塊連續(xù)沒(méi)有被使用的內(nèi)存給數(shù)組
    • 2)從分配的連續(xù)存儲(chǔ)空間中, 地址小的位置開(kāi)始給每個(gè)元素分配空間
    • 3)從每個(gè)元素分配的存儲(chǔ)空間中, 地址最大的位置開(kāi)始存儲(chǔ)數(shù)據(jù)
    • 4)用數(shù)組名指向整個(gè)存儲(chǔ)空間最小的地址
  • 示例

#include <stdio.h>
int main()
{
    int num = 9;
    char cs[] = {'l','n','j'};
    printf("cs = %p\n", &cs);       // cs = 0060FEA9
    printf("cs[0] = %p\n", &cs[0]); // cs[0] = 0060FEA9
    printf("cs[1] = %p\n", &cs[1]); // cs[1] = 0060FEAA
    printf("cs[2] = %p\n", &cs[2]); // cs[2] = 0060FEAB

    int nums[] = {2, 6};
    printf("nums = %p\n", &nums);      // nums = 0060FEA0
    printf("nums[0] = %p\n", &nums[0]);// nums[0] = 0060FEA0
    printf("nums[1] = %p\n", &nums[1]);// nums[1] = 0060FEA4
    
    return 0;
}
  • 注意:字符在內(nèi)存中是以對(duì)應(yīng)ASCII碼值的二進(jìn)制形式存儲(chǔ)的,而非上述的形式。

數(shù)組的越界問(wèn)題

  • 數(shù)組越界導(dǎo)致的問(wèn)題
    • 約錯(cuò)對(duì)象
    • 程序崩潰
    char cs1[2] = {1, 2};
    char cs2[3] = {3, 4, 5};
    cs2[3] = 88; // 注意:這句訪(fǎng)問(wèn)到了不屬于cs1的內(nèi)存
    printf("cs1[0] = %d\n", cs1[0] );
輸出結(jié)果: 88

為什么上述會(huì)輸出88, 自己按照"數(shù)組內(nèi)部存儲(chǔ)細(xì)節(jié)"畫(huà)圖腦補(bǔ)


數(shù)組注意事項(xiàng)

  • 在定義數(shù)組的時(shí)候[]里面只能寫(xiě)整型常量或者是返回整型常量的表達(dá)式
 int ages4['A'] = {19, 22, 33};
 printf("ages4[0] = %d\n", ages4[0]);

  int ages5[5 + 5] = {19, 22, 33};
  printf("ages5[0] = %d\n", ages5[0]);

  int ages5['A' + 5] = {19, 22, 33};
  printf("ages5[0] = %d\n", ages5[0]);
  • 錯(cuò)誤寫(xiě)法
// 沒(méi)有指定元素個(gè)數(shù),錯(cuò)誤
int a[];

// []中不能放變量
int number = 10;
int ages[number]; // 老版本的C語(yǔ)言規(guī)范不支持
printf("%d\n", ages[4]);

int number = 10;
int ages2[number] = {19, 22, 33} // 直接報(bào)錯(cuò)

// 只能在定義數(shù)組的時(shí)候進(jìn)行一次性(全部賦值)的初始化
int ages3[5];
ages10 = {19, 22, 33};

// 一個(gè)長(zhǎng)度為n的數(shù)組,最大下標(biāo)為n-1, 下標(biāo)范圍:0~n-1
int ages4[4] = {19, 22, 33}
ages4[8]; // 數(shù)組角標(biāo)越界
  • 練習(xí)
    • 從鍵盤(pán)錄入當(dāng)天出售BTC的價(jià)格并計(jì)算出售的BTC的總價(jià)和平均價(jià)(比如說(shuō)一天出售了10個(gè)比特幣)

數(shù)組和函數(shù)

  • 數(shù)組可以作為函數(shù)的參數(shù)使用,數(shù)組用作函數(shù)參數(shù)有兩種形式:
    • 一種是把數(shù)組元素作為實(shí)參使用
    • 一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用

數(shù)組元素作為函數(shù)參數(shù)

  • 數(shù)組的元素作為函數(shù)實(shí)參,與同類(lèi)型的簡(jiǎn)單變量作為實(shí)參一樣,如果是基本數(shù)據(jù)類(lèi)型, 那么形參的改變不影響實(shí)參
void change(int val)// int val = number
{
    val = 55;
}
int main(int argc, const char * argv[])
{
    int ages[3] = {1, 5, 8};
    printf("ages[0] = %d", ages[0]);// 1
    change(ages[0]);
    printf("ages[0] = %d", ages[0]);// 1
}
  • 用數(shù)組元素作函數(shù)參數(shù)不要求形參也必須是數(shù)組元素

數(shù)組名作為函數(shù)參數(shù)

  • 在C語(yǔ)言中,數(shù)組名除作為變量的標(biāo)識(shí)符之外,數(shù)組名還代表了該數(shù)組在內(nèi)存中的起始地址,因此,當(dāng)數(shù)組名作函數(shù)參數(shù)時(shí),實(shí)參與形參之間不是"值傳遞",而是"地址傳遞"
  • 實(shí)參數(shù)組名將該數(shù)組的起始地址傳遞給形參數(shù)組,兩個(gè)數(shù)組共享一段內(nèi)存單元, 系統(tǒng)不再為形參數(shù)組分配存儲(chǔ)單元
  • 既然兩個(gè)數(shù)組共享一段內(nèi)存單元, 所以形參數(shù)組修改時(shí),實(shí)參數(shù)組也同時(shí)被修改了
void change2(int array[3])// int array = 0ffd1
{
    array[0] = 88;
}
int main(int argc, const char * argv[])
{
    int ages[3] = {1, 5, 8};
    printf("ages[0] = %d", ages[0]);// 1
    change(ages);
    printf("ages[0] = %d", ages[0]);// 88
}

數(shù)組名作函數(shù)參數(shù)的注意點(diǎn)

  • 在函數(shù)形參表中,允許不給出形參數(shù)組的長(zhǎng)度
void change(int array[])
{
    array[0] = 88;
}
  • 形參數(shù)組和實(shí)參數(shù)組的類(lèi)型必須一致,否則將引起錯(cuò)誤。
void prtArray(double array[3]) // 錯(cuò)誤寫(xiě)法
{
    for (int i = 0; i < 3; i++) {
        printf("array[%d], %f", i, array[i]);
    }
}
int main(int argc, const char * argv[])
{
    int ages[3] = {1, 5, 8};
    prtArray(ages[0]);
}
  • 當(dāng)數(shù)組名作為函數(shù)參數(shù)時(shí), 因?yàn)樽詣?dòng)轉(zhuǎn)換為了指針類(lèi)型,所以在函數(shù)中無(wú)法動(dòng)態(tài)計(jì)算除數(shù)組的元素個(gè)數(shù)
void printArray(int array[])
{
    printf("printArray size = %lu\n", sizeof(array)); // 8
    int length = sizeof(array)/ sizeof(int); // 2
    printf("length = %d", length);
}
  • 練習(xí):
    • 設(shè)計(jì)一個(gè)函數(shù)int arrayMax(int a[], int count)找出數(shù)組元素的最大值
    • 從鍵盤(pán)輸入3個(gè)0-9的數(shù)字,然后輸出0~9中哪些數(shù)字沒(méi)有出現(xiàn)過(guò)
    • 要求從鍵盤(pán)輸入6個(gè)0~9的數(shù)字,排序后輸出
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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