程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話數組入門之數組的聲明與二維數組的模仿

C說話數組入門之數組的聲明與二維數組的模仿

編輯:關於C++

C說話數組入門之數組的聲明與二維數組的模仿。本站提示廣大學習愛好者:(C說話數組入門之數組的聲明與二維數組的模仿)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話數組入門之數組的聲明與二維數組的模仿正文


說話中指針與數組這兩個概念之間的接洽是密弗成分的,以致於假如不克不及懂得一個概念,就沒法完全懂得另外一個概念。

C說話中的數組值得留意的處所有以下兩點:

C說話中只要一維數組,並且數組的年夜小必需在編譯期就作為一個常數肯定上去。但是,C說話中數組的元素可所以任何類型的對象,固然也能夠是別的一個數組。如許,要“仿真”出一個多維數組就不是一件難事。
關於一個數組,我們只可以或許做兩件事:肯定該數組的年夜小,和取得指向該數組下標為0的元素的指針。其他有關數組的操作,哪怕它們看上去是以數組下標停止運算的,現實上都是經由過程指針停止的。換句話說,任何一個數組下標運算都同等於一個對應的指針運算,是以我們完整可以根據指針行動界說數組下標的行動。
一旦我們完全弄懂了這兩點和它們所隱含的意思,那末懂得C說話的數組運算就不外是“小菜一碟”。假如不清晰上述兩點內容,那末C說話數組運算便可能會給編程者帶來很多迷惑。須要特殊指出的是,編程者應當具有將數組運算與它們對應的指針運算融匯貫穿的才能,在思慮有關成績時年夜腦中對這兩種運算可以或許自若切換。毫無滯礙。

任何法式設計說話中都內建有索引運算,在C說話中索引運算是以指針算術的情勢來界說的。

若何聲明一個數組

要懂得C說話中數組的運作機制,我們起首必需懂得若何聲明一個數組,例如:

int a[3];

這個語句聲清楚明了a是一個具有了3個整型元素的數組,相似的,

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

聲清楚明了b是一個具有17個元素的數組,個中每一個元素都是一個構造,該構造中包含了一個具有4個整形元素的數組(定名為p)和一個雙精度類型的變量(定名為x)。

如今斟酌上面的例子:

int calendar[12][31];

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

假如calendar不是用於sizeof的操作數,而是用於其他的場所,那末calendar老是被調換成一個指向calendar數組的肇端元素的指針。要懂得下面這句話的寄義,我們起首必需懂得有關指針的一些細節。

二維數組模仿
*a即數組a中下標為0的元素的援用。例如,我們可以如許寫:

*a=84;

這個語句將數組a中下標為0的元素的值設置為84.異樣事理,*(a+1)數組a中下標為1的的元素的援用,以此類推,概而言之,*(a+i)即數組中下標為i的元素的援用,這類寫法是如斯經常使用,是以被簡記為a[i].

恰是這一概念讓C說話老手難於懂得,現實上,因為a+i與i+a的寄義一樣,是以a[i]和i[a]也具有異樣的寄義。或許某些匯編說話法式員會發明後一種寫法很熟習,但我們相對不推舉這類寫法。

如今我們可以斟酌二維數組了,正如後面所評論辯論的,它現實上是以數組為元素的數組,雖然我們也能夠完整根據指針編寫把持一維數組的法式,如許做在一維情況下其實不艱苦,然則關於二維數組從記法上的方便性來講采取下述情勢就簡直是弗成替換了。還有,假如我們僅僅應用指針來把持二維數組,我們將不能不與C說話中最為“昏暗不明”的部門打交道,並經常遭受到埋伏著的編譯器bug。

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

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

然後考一考本身,calendar[4]的寄義是甚麼?

由於calendar是一個有著12個數組類型元素的數組,它的每一個數組類型元素又是一個有著31個整型數組,所以calendar[4]是 calendar數組的第五個元素,是calendar數組中12個有著31個整型元素的數組之一,是以calendar[4]的行動也就表示一個有著31個整形元素的數組的行動,例如sizeof(calendar[4])的成果是31與sizeof(int)的乘積。

p=calendar[4];

這個語句使指針p指向了數組calendar[4]中下標為0的元素。假如calendar[4]是一個數組,我們固然可以經由過程下標的情勢來指定這個數組中的元素,就像上面如許:

i = calendar[4][7];

我們確切也能夠如許做。照樣與後面相似的事理,這個語句可以寫成上面如許而表達式的意思堅持不變:

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

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

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

從這裡我們不難發明,用方括號的下標情勢很顯著地要比指針來表達輕便很多。上面我們再看:

p = calendar;

這個語句長短法的,由於calendar是一個二維數組,即數組的數組,在此處的高低文中應用calendar稱號會將其轉化為一個指向數組的指針,而p是一個指向整型變量的指針,這個語句試圖將一個類型的指針賦值給另外一品種型的指針,所所以不法的。

很明顯,我們須要一種聲明指向數組的指針的辦法,經由了後面對相似成績誨人不倦的評論辯論,結構出上面的語句應當不須要廢多年夜力量:

int (*ap)[31];

這個語句的後果是,聲清楚明了*ap是一個具有三十一個整型元素的數組ap就是一個指向如許的數組的指針,因此我們可以如許寫:

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

如許,monthp將指向數組calendar的第一個元素,也就是數組calendar的12個有著31個元素的數組類型元素之一。

假定在新的一年開端時,我們須要清空calendar數組,用下標情勢可以很輕易做到:

int month;

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

下面的代碼段假如才用指針應當若何表現呢?我們很輕易地把 calendar[month][day]=0; 表現為*(*(calendar+month)+day)=0;

然則真正有關的部門是哪些呢?

假如指針monthp指向一個具有31個整型元素的數組,而calendar的元素也是一個具有31個整型元素的數組,是以就像是在其他情形中我們可使用一個指針遍歷一個數組一樣,這裡我們異樣可使用指針monthp以步進的方法遍歷數組calendar:

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved