欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言數(shù)組入門之?dāng)?shù)組的聲明與二維數(shù)組的模擬

 更新時間:2015年12月02日 15:15:21   投稿:goldensun  
這篇文章主要介紹了C語言數(shù)組入門之?dāng)?shù)組的聲明與二維數(shù)組的模擬,數(shù)組學(xué)習(xí)的同時也要相應(yīng)理解C語言指針的作用,需要的朋友可以參考下

語言中指針與數(shù)組這兩個概念之間的聯(lián)系是密不可分的,以至于如果不能理解一個概念,就無法徹底理解另一個概念。

C語言中的數(shù)組值得注意的地方有以下兩點:

C語言中只有一維數(shù)組,而且數(shù)組的大小必須在編譯期就作為一個常數(shù)確定下來。然而,C語言中數(shù)組的元素可以是任何類型的對象,當(dāng)然也可以是另外一個數(shù)組。這樣,要“仿真”出一個多維數(shù)組就不是一件難事。
對于一個數(shù)組,我們只能夠做兩件事:確定該數(shù)組的大小,以及獲得指向該數(shù)組下標(biāo)為0的元素的指針。其他有關(guān)數(shù)組的操作,哪怕它們看上去是以數(shù)組下標(biāo)進行運算的,實際上都是通過指針進行的。換句話說,任何一個數(shù)組下標(biāo)運算都等同于一個對應(yīng)的指針運算,因此我們完全可以依據(jù)指針行為定義數(shù)組下標(biāo)的行為。
一旦我們徹底弄懂了這兩點以及它們所隱含的意思,那么理解C語言的數(shù)組運算就不過是“小菜一碟”。如果不清楚上述兩點內(nèi)容,那么C語言數(shù)組運算就可能會給編程者帶來許多困惑。需要特別指出的是,編程者應(yīng)該具備將數(shù)組運算與它們對應(yīng)的指針運算融匯貫通的能力,在思考有關(guān)問題時大腦中對這兩種運算能夠自如切換。毫無滯礙。

任何程序設(shè)計語言中都內(nèi)建有索引運算,在C語言中索引運算是以指針?biāo)阈g(shù)的形式來定義的。

如何聲明一個數(shù)組

要理解C語言中數(shù)組的運作機制,我們首先必須理解如何聲明一個數(shù)組,例如:

int a[3];

這個語句聲明了a是一個擁有了3個整型元素的數(shù)組,類似的,

struct{
 int p[4];
 double x;
}b[17];

聲明了b是一個擁有17個元素的數(shù)組,其中每個元素都是一個結(jié)構(gòu),該結(jié)構(gòu)中包括了一個擁有4個整形元素的數(shù)組(命名為p)和一個雙精度類型的變量(命名為x)。

現(xiàn)在考慮下面的例子:

int calendar[12][31];

這個語句聲明了calendar是一個數(shù)組,該數(shù)組擁有12個數(shù)組類型的元素,其中每個元素都是擁有31個整型元素的數(shù)組(而不是一個擁有31個數(shù)組類型的元素的數(shù)組,其中每個元素又是一個擁有12個整型數(shù)組元素的數(shù)組)因此sizeof(calendar)的值是372(31*12)與sizeof(int)的乘積。

如果calendar不是用于sizeof的操作數(shù),而是用于其他的場合,那么calendar總是被替換成一個指向calendar數(shù)組的起始元素的指針。要理解上面這句話的含義,我們首先必須理解有關(guān)指針的一些細節(jié)。

二維數(shù)組模擬
*a即數(shù)組a中下標(biāo)為0的元素的引用。例如,我們可以這樣寫:

*a=84;

這個語句將數(shù)組a中下標(biāo)為0的元素的值設(shè)置為84.同樣道理,*(a+1)數(shù)組a中下標(biāo)為1的的元素的引用,以此類推,概而言之,*(a+i)即數(shù)組中下標(biāo)為i的元素的引用,這種寫法是如此常用,因此被簡記為a[i].

正是這一概念讓C語言新手難于理解,實際上,由于a+i與i+a的含義一樣,因此a[i]和i[a]也具有同樣的含義。也許某些匯編語言程序員會發(fā)現(xiàn)后一種寫法很熟悉,但我們絕對不推薦這種寫法。

現(xiàn)在我們可以考慮二維數(shù)組了,正如前面所討論的,它實際上是以數(shù)組為元素的數(shù)組,盡管我們也可以完全依據(jù)指針編寫操縱一維數(shù)組的程序,這樣做在一維情形下并不困難,但是對于二維數(shù)組從記法上的便利性來說采用下述形式就幾乎是不可替代了。還有,如果我們僅僅使用指針來操縱二維數(shù)組,我們將不得不與C語言中最為“晦暗不明”的部分打交道,并常常遭遇到潛伏著的編譯器bug。

讓我們回過頭來再看幾個聲明:

int calendar[12][31];
int *p
int i;

然后考一考自己,calendar[4]的含義是什么?

因為calendar是一個有著12個數(shù)組類型元素的數(shù)組,它的每個數(shù)組類型元素又是一個有著31個整型數(shù)組,所以calendar[4]是 calendar數(shù)組的第五個元素,是calendar數(shù)組中12個有著31個整型元素的數(shù)組之一,因此calendar[4]的行為也就表現(xiàn)一個有著31個整形元素的數(shù)組的行為,例如sizeof(calendar[4])的結(jié)果是31與sizeof(int)的乘積。

p=calendar[4];

這個語句使指針p指向了數(shù)組calendar[4]中下標(biāo)為0的元素。如果calendar[4]是一個數(shù)組,我們當(dāng)然可以通過下標(biāo)的形式來指定這個數(shù)組中的元素,就像下面這樣:

i = calendar[4][7];

我們確實也可以這樣做。還是與前面類似的道理,這個語句可以寫成下面這樣而表達式的意思保持不變:

i = *(calendar[4]+7);

這個語句還可以進一步寫成:

i = *(*(calendar+4)+7);

從這里我們不難發(fā)現(xiàn),用方括號的下標(biāo)形式很明顯地要比指針來表達簡便得多。下面我們再看:

p = calendar;

這個語句是非法的,因為calendar是一個二維數(shù)組,即數(shù)組的數(shù)組,在此處的上下文中使用calendar名稱會將其轉(zhuǎn)化為一個指向數(shù)組的指針,而p是一個指向整型變量的指針,這個語句試圖將一個類型的指針賦值給另一種類型的指針,所以是非法的。

很顯然,我們需要一種聲明指向數(shù)組的指針的方法,經(jīng)過了前面對類似問題不厭其煩的討論,構(gòu)造出下面的語句應(yīng)該不需要廢多大力氣:

int (*ap)[31];

這個語句的效果是,聲明了*ap是一個擁有三十一個整型元素的數(shù)組ap就是一個指向這樣的數(shù)組的指針,因而我們可以這樣寫:

int(*monthp)[31];
Monthp = calendar;

這樣,monthp將指向數(shù)組calendar的第一個元素,也就是數(shù)組calendar的12個有著31個元素的數(shù)組類型元素之一。

假定在新的一年開始時,我們需要清空calendar數(shù)組,用下標(biāo)形式可以很容易做到:

int month;

for(month=0;month < 12;month++){
 int day;
  for(day=0; day < 31;day++)
   calendar[month][day]=0;
}

上面的代碼段如果才用指針應(yīng)該如何表示呢?我們很容易地把 calendar[month][day]=0; 表示為*(*(calendar+month)+day)=0;

但是真正有關(guān)的部分是哪些呢?

如果指針monthp指向一個擁有31個整型元素的數(shù)組,而calendar的元素也是一個擁有31個整型元素的數(shù)組,因此就像是在其他情況中我們可以使用一個指針遍歷一個數(shù)組一樣,這里我們同樣可以使用指針monthp以步進的方式遍歷數(shù)組calendar:

int (*monthp)[31];
for(monthp=calendar;monthp < &calendar[12];monthp++){
 int *dayp;
 for(dayp=*monthp;dayp < &(*monthp)[31];dayp++)
 *dayp=0;
}

 

相關(guān)文章

  • C++ vector的用法小結(jié)

    C++ vector的用法小結(jié)

    這篇文章主要介紹了c++中,vector是一個十分有用的容器,下面對這個容器做一下總結(jié)
    2013-12-12
  • 教你用C語言實現(xiàn)三子棋

    教你用C語言實現(xiàn)三子棋

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單三子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 關(guān)于C/C++中可變參數(shù)的詳細介紹(va_list,va_start,va_arg,va_end)

    關(guān)于C/C++中可變參數(shù)的詳細介紹(va_list,va_start,va_arg,va_end)

    可變參數(shù)的函數(shù)原理其實很簡單,而va系列是以宏定義來定義的,實現(xiàn)跟堆棧相關(guān).我們寫一個可變函數(shù)的C函數(shù)時,有利也有弊,所以在不必要的場合,我們無需用到可變參數(shù)。如果在C++里,我們應(yīng)該利用C++的多態(tài)性來實現(xiàn)可變參數(shù)的功能,盡量避免用C語言的方式來實現(xiàn)
    2013-10-10
  • OpenCV實現(xiàn)圖像輪廓檢測以及外接矩形

    OpenCV實現(xiàn)圖像輪廓檢測以及外接矩形

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像輪廓檢測以及外接矩形,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++?命名空間?using聲明使用示例詳解

    C++?命名空間?using聲明使用示例詳解

    這篇文章主要為大家介紹了C++?命名空間?using聲明使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 基于linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)

    基于linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)

    本篇文章是對linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++函數(shù)重載的細節(jié)圖文詳解

    C++函數(shù)重載的細節(jié)圖文詳解

    函數(shù)重載即函數(shù)名相同,函數(shù)形參列表不同(函數(shù)特征標(biāo)不同)的一類函數(shù)稱為函數(shù)重載,下面這篇文章主要給大家介紹了關(guān)于C++函數(shù)重載的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 一文詳解C++中隱含的this指針

    一文詳解C++中隱含的this指針

    這篇文章主要帶大家詳細了解一下C++中隱含的this指針,文中通過代碼示例和圖文介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • C語言編程C++柔性數(shù)組結(jié)構(gòu)示例講解

    C語言編程C++柔性數(shù)組結(jié)構(gòu)示例講解

    這篇文章主要介紹了C語言編程系列中的柔性數(shù)組,文中含有詳細的示例代碼講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Java?C++?算法題解leetcode145商品折扣后最終價格單調(diào)棧

    Java?C++?算法題解leetcode145商品折扣后最終價格單調(diào)棧

    這篇文章主要介紹了Java?C++?算法題解leetcode145商品折扣后最終價格單調(diào)棧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09

最新評論