亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言中數(shù)組的一些基本知識(shí)小結(jié)

 更新時(shí)間:2016年04月08日 14:50:45   作者:ForeverYoung21  
這篇文章主要介紹了C語(yǔ)言中數(shù)組的一些基本知識(shí)小結(jié),其中重點(diǎn)是對(duì)于數(shù)組的內(nèi)存分配相關(guān)方面的知識(shí)整理,需要的朋友可以參考下

初始化數(shù)組

int ages[3] = {4, 6, 9};
int nums[10] = {1,2}; // 其余的自動(dòng)初始化為0
int nums[] = {1,2,3,5,6}; // 根據(jù)大括號(hào)中的元素個(gè)數(shù)確定數(shù)組元素的個(gè)數(shù)
int nums[5] = {[4] = 3,[1] = 2}; // 指定元素個(gè)數(shù),同時(shí)給指定元素進(jìn)行初始化
int nums[3]; nums[0] = 1; nums[1] = 2; nums[2] = 3; // 先定義,后初始化

定義但是未初始化,數(shù)組中有值,但是是垃圾值。
對(duì)于數(shù)組來(lái)說(shuō),一旦有元素被初始 化,其他元素都被賦值0。
計(jì)算數(shù)組中元素的個(gè)數(shù)

int count = sizeof(數(shù)組) / sizeof(數(shù)組[0]) // 數(shù)組的長(zhǎng)度 = 數(shù)組占用的總字節(jié)數(shù) / 數(shù)組元素占用的字節(jié)數(shù)

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

在定義數(shù)組的時(shí)候[]里面只能寫(xiě)整型常量或者是返回整型常量的表達(dá)式。

int ages['A'] = {19, 22, 33};

printf("ages[0] = %d\n", ages[0]);

int ages[5 + 5] = {19, 22, 33};

printf("ages[0] = %d\n", ages[0]);

int ages['A' + 5] = {19, 22, 33};

printf("ages[0] = %d\n", ages[0])

錯(cuò)誤寫(xiě)法。

沒(méi)有指定元素個(gè)數(shù)(int nums[] = {1,2,3,5,6}; 這樣是可以的,但是如果先聲明,并沒(méi)有初始化,則是錯(cuò)誤的)

int a[]; // 錯(cuò)誤

[]中不能放變量

int number = 10;

int ages[number]; // 不報(bào)錯(cuò), 但是沒(méi)有初始化, 里面是隨機(jī)值
  > int number = 10;
  > 
  > int ages[number] = {19, 22, 33} // 直接報(bào)錯(cuò)

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

  - 訪(fǎng)問(wèn)數(shù)組越界。

數(shù)組的內(nèi)存分配:

變量在內(nèi)存中是從大到小尋址的(內(nèi)存中以字節(jié)為單位),比如00000000 00000000 00000000 00001010在內(nèi)存中,00001010的地址是最小的;而數(shù)組則有些不同,數(shù)組的元素自然的從上往下排列 存儲(chǔ),整個(gè)數(shù)組的地址為首元素的地址。 (但是組成元素的字節(jié)還是按從大到小)

201648144513884.png (816×495)

201648144542474.png (788×702)

注意:字符在內(nèi)存中是以對(duì)應(yīng)ASCII值的二進(jìn)制形式存儲(chǔ)的,而非上表的形式。 在這個(gè)例子中,數(shù)組x的地址為它的首元素的地址0x08,數(shù)組ca的地址為0x03。
注意數(shù)組越界問(wèn)題,越界會(huì)訪(fǎng)問(wèn)到其他內(nèi)容(比如有兩個(gè)數(shù)組在內(nèi)存中挨著,第一個(gè)數(shù)組越界可能會(huì)訪(fǎng)問(wèn)到第二個(gè)數(shù)組的元素),甚至?xí)尦绦虮罎ⅰ?/p>

當(dāng)數(shù)組名作為函數(shù)參數(shù)時(shí), 因?yàn)樽詣?dòng)轉(zhuǎn)換為了指針類(lèi)型,所以在函數(shù)中無(wú)法動(dòng)態(tài)計(jì)算除數(shù)組的元素個(gè)數(shù)。

在64位編譯器下,指針類(lèi)型默認(rèn)為8個(gè)字節(jié)。

有的時(shí)候我們可能想要在一個(gè)函數(shù)里面動(dòng)態(tài)計(jì)算數(shù)組的個(gè)數(shù),所以可能會(huì)這么做:

void printMyArray(int myArray[]) {
   int length = sizeof(myArray) / sizeof(myArray[0]);
   for(int i = 0; i < length; i++) {
    printf("%i", myArray[i]);
   }
}

int main() {
  int myArray[5] = {1,2,3,4,5};
  printMyArray(myArray);
  return 0;
}

可以看到在printMyArray函數(shù)中我們動(dòng)態(tài)計(jì)算傳進(jìn)來(lái)的數(shù)組的個(gè)數(shù),但是結(jié)果是錯(cuò)誤的,因?yàn)樗荒茌敵銮皟蓚€(gè)數(shù)。

這是因?yàn)?,在把?shù)組當(dāng)成函數(shù)的參數(shù)的時(shí)候,數(shù)組會(huì)被認(rèn)為成指針,所以是8個(gè)字節(jié),所以計(jì)算出的length是2,所以只能輸出前兩個(gè)數(shù)字。

解決:我們需要給出一個(gè)新的參數(shù)來(lái)獲得length,在main()里面計(jì)算好length然后傳入printMyArray。

void printMyArray(int myArray[], int length) {
  for(int i = 0; i < length; i++) {
    printf("%i ", myArray[i]);
  }
}

int main(int argc, const char * argv[]) {
  int myArray[5] = {1,2,3,4,5};
  int length = sizeof(myArray) / sizeof(myArray[0]);
  printMyArray(myArray, length);
  return 0;
}

“填坑法”的思想:

比如給出這樣一題。要求從鍵盤(pán)輸入6個(gè)0~9的數(shù)字,排序后輸出。

做法有很多,”填坑法”的意思就是首先定義一個(gè)10個(gè)數(shù)的數(shù)組(0~9),初始化都為0。

接著接受用戶(hù)的輸入(可以用for循環(huán)),關(guān)鍵的一步是,將用戶(hù)輸入的值作為數(shù)組的下標(biāo),將這個(gè)下標(biāo)所對(duì)應(yīng)的值改為1(填坑),再接著for循環(huán)輸出數(shù)組中值是1的索引。

// 空間換時(shí)間, 適合數(shù)據(jù)比較少
//  1.定義數(shù)組,保存用戶(hù)輸入的整數(shù)
//  一定要給數(shù)組初始化, 否則有可能是一些隨機(jī)值
  int numbers[10] = {0};
//  2.接收用戶(hù)輸入的整數(shù)
//  2.1定義變量接收用戶(hù)輸入的整數(shù)
  int index = -1;
  for (int i = 0; i < 6; i++) {
    printf("請(qǐng)輸入第%d個(gè)整數(shù)\n", i + 1);
    scanf("%d", &index);
//    將用戶(hù)輸入的值作為索引取修改數(shù)組中對(duì)應(yīng)的元素的值為1
//    指針的時(shí)候回來(lái)演示剛才的問(wèn)題
    numbers[index] = 1 ;
  }

  int length = sizeof(numbers) / sizeof(numbers[0]);
  for (int i = 0; i < length; i++) {
    if (1 == numbers[i]) {
      // 輸出索引
      printf("%d", i);
    }
  }

這個(gè)做法的要點(diǎn)是數(shù)組中的初始值都為0,而數(shù)組的索引和用戶(hù)輸入的數(shù)字是一一對(duì)應(yīng)的,所以只需要將用戶(hù)輸入的數(shù)字相對(duì)應(yīng)的索引的元素改成1,然后再for循環(huán)輸出的話(huà)相當(dāng)于有序輸出,最后得到結(jié)果。

但是這種做法是有問(wèn)題的,比如用戶(hù)輸入了重復(fù)的數(shù)字,但是上面的做法只能將相同的數(shù)字輸出一次。我們的做法是將相同索引的元素的數(shù)字累加,之后再增加一層循環(huán)來(lái)進(jìn)行輸出。

//  1.定義數(shù)組,保存用戶(hù)輸入的整數(shù)
  int numbers[10] = {0};
//  2.接收用戶(hù)輸入的整數(shù)
//  2.1定義變量接收用戶(hù)輸入的整數(shù)
  int index = -1;
  for (int i = 0; i < 6; i++) {
    printf("請(qǐng)輸入第%d個(gè)整數(shù)\n", i + 1);
    scanf("%d", &index);
//    將用戶(hù)輸入的值作為索引取修改數(shù)組中對(duì)應(yīng)的元素的值為1
//    假設(shè) 用戶(hù)輸入的是 1,1,1,2,2,2
    numbers[index] = numbers[index] + 1 ;
  }

  int length = sizeof(numbers) / sizeof(numbers[0]);
  for (int i = 0; i < length; i++) {
//    j = 1 因?yàn)槿绻麛?shù)組元素中存儲(chǔ)的值是0不用輸出
//    將i對(duì)應(yīng)存儲(chǔ)空間中的元素取出,判斷需要輸出幾次
    for (int j = 1; j <= numbers[i]; j++) {
      printf("%d", i);// 1 1 1 2 2 2
    }
  }

選擇排序

主要思想就是,基本上默認(rèn)數(shù)組中第一個(gè)元素為最大(最小)值,之后將這個(gè)元素和后面的每個(gè)元素都進(jìn)行比較,以由大到小排序?yàn)槔?dāng)?shù)谝粋€(gè)值遇到比其大的,就進(jìn)行交換。這樣第一輪過(guò)后,第一位就是最大的。接著進(jìn)行第二輪,由第二個(gè)數(shù)開(kāi)始逐個(gè)比較,遇到比第二個(gè)數(shù)大的進(jìn)行交換,這樣第二輪之后第二個(gè)數(shù)就是第二大的了,以此類(lèi)推,不斷進(jìn)行選擇,最后完成排序。

void selectSort(int numbers[], int length) {
  for (int i = 0; i < length; i++) {
    for (int j = i + 1; j < length; j++) {
      if (numbers[i] < numbers[j]) {
        int temp = numbers[i];
        numbers[i] = numbers[j];
        numbers[j] = temp;
      }
    }
  }
}

int main(int argc, const char * argv[]) {
  int myArray[] = {42, 7, 1, -3, 88};
  int length = sizeof(myArray) / sizeof(myArray[0]);
  selectSort(myArray, length);
  for (int i = 0; i < length; i++) {
    printf("%i ", myArray[i]);
  }
  return 0;
}

在寫(xiě)的時(shí)候可以這樣想:當(dāng)?shù)谝粋€(gè)數(shù)來(lái)比較的時(shí)候,i = 0,那么j應(yīng)該等于i + 1,因?yàn)榈谝粋€(gè)數(shù)要和第二個(gè)數(shù)開(kāi)始比,并且比較length - 1次;當(dāng)i = 1時(shí),j = 2,并且比較length - 2次,以此類(lèi)推;上面寫(xiě)的是由大到小排序。

冒泡排序

主要思想是兩個(gè)相鄰的元素進(jìn)行比較,以由小到大排序?yàn)槔?,那么由第一個(gè)元素開(kāi)始和第二個(gè)比較,如果第一個(gè)比第二個(gè)大,那么就進(jìn)行交換;然后進(jìn)行第二個(gè)和第三個(gè)元素的比較,以此類(lèi)推,第一輪之后,那么數(shù)組的最后一個(gè)元素就是最大的,以此類(lèi)推。

void bubbleSort(int numbers[], int length) {
  for (int i = 0; i < length - 1; i++) {
    for (int j = 0; j < length - i - 1; j++) {
      if (numbers[j] > numbers[j + 1]) {
        int temp = numbers[j];
        numbers[j] = numbers[j + 1];
        numbers[j + 1] = temp;
      }
    }
  }
}

int main(int argc, const char * argv[]) {
  int myArray[] = {42, 7, 1, -3, 88};
  int length = sizeof(myArray) / sizeof(myArray[0]);
  bubbleSort(myArray, length);
  for (int i = 0; i < length; i++) {
    printf("%i ", myArray[i]);
  }
  return 0;
}

注意這里和選擇排序不同的是,比較的并非numbers[i]和numbers[j],而是比較的numbers[j]和numbers[j+1],而外層循環(huán)的i代表比較的輪數(shù),內(nèi)層循環(huán)才是真正的每一輪進(jìn)行的比較。這里是由小到大排序。

折半查找

折半查找顧名思義,我們找到數(shù)組的最大值max,最小值min求出中間值mid,然后用mid作為數(shù)組下標(biāo)得到對(duì)應(yīng)的元素,用這個(gè)元素和目標(biāo)值key進(jìn)行比較:

如果numbers[mid] > key,那么說(shuō)明key在min和mid之間,那么就設(shè)置max為mid - 1,min不變,然后重新計(jì)算mid,重復(fù)上述步驟,最后找出key。

如果numbers[mid] < key,那么說(shuō)明key在mid和max之間,那么就設(shè)置min為mid + 1,max不變,然后重新計(jì)算mid,重復(fù)上述步驟,最后找出key。

注意這里的結(jié)束條件,有可能數(shù)組中有這個(gè)key,也有可能沒(méi)有,那么當(dāng)min > max時(shí),說(shuō)明數(shù)組中并沒(méi)有這個(gè)key,要小心這種情況。

折半查找要求數(shù)組必須是有序的。(有序表)

int binSearch(int myArray[], int length, int key) {
  int index = -1;

  int max = length - 1;
  int min = 0;
  int mid = (max + min) / 2;

  while (min <= max) {
    if (myArray[mid] > key) {
      max = mid - 1;
    } else if (myArray[mid] < key){
      min = mid + 1;
    } else if (myArray[mid] == key) {
      index = mid;
      break;
    }
    mid = (max + min) / 2;
  }

  return index;
}

int main(int argc, const char * argv[]) {
  int myArray[] = {-3, 1, 7, 42, 88};
  int length = sizeof(myArray) / sizeof(myArray[0]);
  int index = binSearch(myArray, length, 88);
  printf("index: %i ", index);
  return 0;
}

首先我假設(shè)index = -1,表示沒(méi)有相應(yīng)的值。接著獲取max,min,mid的值,注意while循環(huán)的條件,在這里我用的是當(dāng)min <= max的時(shí)候循環(huán),當(dāng)min > max時(shí)候跳出循環(huán),說(shuō)明并未找到key的值。在循環(huán)體里面,像剛才分析的那樣判斷,當(dāng)myArray[mid] == key的時(shí)候說(shuō)明我們找到了這個(gè)值,那么將index設(shè)置成找到值的下標(biāo),然后跳出循環(huán)。如果未找到值則index = -1。

相關(guān)文章

  • C++命名空間實(shí)例詳解

    C++命名空間實(shí)例詳解

    這篇文章主要介紹了C++命名空間實(shí)例詳解,有感興趣的同學(xué)可以研究下
    2021-02-02
  • C++關(guān)鍵字mutable學(xué)習(xí)筆記

    C++關(guān)鍵字mutable學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++關(guān)鍵字mutable學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • dword ptr指令詳細(xì)解析

    dword ptr指令詳細(xì)解析

    8086CPU的指令,可以處理兩種尺寸的數(shù)據(jù),byte和word。所以在機(jī)器指令中要指明,指令進(jìn)行的是字操作還是字節(jié)操作
    2013-09-09
  • 深入理解c++模板中的class與typename

    深入理解c++模板中的class與typename

    在c++Template中很多地方都用到了typename與class這兩個(gè)關(guān)鍵字,而且好像可以替換,是不是這兩個(gè)關(guān)鍵字完全一樣呢?下面這篇文章主要給大家介紹了關(guān)于c++模板中class與typename的相關(guān)資料,需要的朋友可以參考下。
    2017-07-07
  • C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換

    C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換

    這篇文章介紹了C++使用boost::lexical_cast進(jìn)行數(shù)值轉(zhuǎn)換的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車(chē)輛

    使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車(chē)輛

    這篇文章主要為大家詳細(xì)介紹了使用OpenCV實(shí)現(xiàn)檢測(cè)和追蹤車(chē)輛,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Matlab繪制雨云圖的方法詳解

    Matlab繪制雨云圖的方法詳解

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)雨云圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2022-05-05
  • 深度探究C++中的函數(shù)重載的用法

    深度探究C++中的函數(shù)重載的用法

    這篇文章主要介紹了C++中的函數(shù)重載用法,包括重載時(shí)參數(shù)類(lèi)型的差異以及匹配和轉(zhuǎn)換等方面問(wèn)題的講解,需要的朋友可以參考下
    2016-01-01
  • 詳解C語(yǔ)言初階之?dāng)?shù)組

    詳解C語(yǔ)言初階之?dāng)?shù)組

    這篇文章主要介紹了C語(yǔ)言中的數(shù)組基礎(chǔ),介紹了其相關(guān)概念,具有一定參考價(jià)值。需要的朋友可以了解下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • Java C++題解leetcode856括號(hào)的分?jǐn)?shù)

    Java C++題解leetcode856括號(hào)的分?jǐn)?shù)

    這篇文章主要為大家介紹了Java C++題解leetcode856括號(hào)的分?jǐn)?shù)實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評(píng)論