亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言數組入門之數組的聲明與二維數組的模擬

2020-05-23 14:11:58
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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 *pint 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;}

 



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久中文字幕| 成人啪啪免费看| 精品中文视频在线| 78色国产精品| 久久69精品久久久久久国产越南| 久久久精品2019中文字幕神马| 欧美理论在线观看| 91免费人成网站在线观看18| 久久人体大胆视频| 69国产精品成人在线播放| 亚洲乱码av中文一区二区| 久久影院资源网| 精品国产欧美一区二区三区成人| 亚洲最大福利网| 欧美激情一级二级| 国产www精品| 91香蕉亚洲精品| 91精品免费视频| 欧美日本高清视频| 亚洲自拍欧美色图| 欧美日韩亚洲一区二区| 日韩美女av在线免费观看| 少妇av一区二区三区| 中文字幕无线精品亚洲乱码一区| 亚洲一级免费视频| 国外成人在线播放| 在线观看欧美视频| 久久久久久亚洲精品中文字幕| 日韩人体视频一二区| 一区二区三区四区视频| 9.1国产丝袜在线观看| 日韩精品极品毛片系列视频| 中文字幕亚洲欧美一区二区三区| 美女性感视频久久久| 久久精品福利视频| 亚洲精品av在线播放| 伊人伊成久久人综合网小说| 国产综合在线视频| 日韩中文字幕网址| 高清在线视频日韩欧美| 亚洲精品久久久久国产| 亚洲精品日韩激情在线电影| 亚洲精品自在久久| 日本国产一区二区三区| 久久成人精品视频| 欧美午夜女人视频在线| 97久久精品视频| 黑丝美女久久久| 精品亚洲国产视频| 国产精品大片wwwwww| 久久国产精品久久久久久| 亚洲欧美日韩国产精品| 清纯唯美亚洲综合| 在线色欧美三级视频| 国产精品亚洲аv天堂网| 日韩精品日韩在线观看| 亚洲的天堂在线中文字幕| 欧美成aaa人片在线观看蜜臀| 国语自产偷拍精品视频偷| 欧美又大又粗又长| 色天天综合狠狠色| 亚洲国产精品电影在线观看| 国产精品电影久久久久电影网| 日韩免费在线视频| 国产精品成人aaaaa网站| 欧美中文在线字幕| 91热福利电影| 日日狠狠久久偷偷四色综合免费| 久久精品人人做人人爽| 自拍视频国产精品| 海角国产乱辈乱精品视频| 久久久噜久噜久久综合| 亚洲片av在线| 欧洲精品毛片网站| 不用播放器成人网| 午夜精品在线视频| 国产精品久久久久久av下载红粉| 中文综合在线观看| 亚洲免费高清视频| 亚洲综合中文字幕68页| 91精品国产色综合久久不卡98| 亚洲色图17p| 久久久免费精品| 亚洲美女www午夜| 91chinesevideo永久地址| 亚洲精品资源在线| 国产精品96久久久久久| 欧美综合激情网| 亚洲xxxx做受欧美| 成人黄色在线播放| 亚洲欧洲在线观看| 国模精品视频一区二区三区| 黑人极品videos精品欧美裸| 亚洲国产日韩欧美在线动漫| 精品国偷自产在线视频99| 91沈先生在线观看| 韩国福利视频一区| 亚洲网在线观看| 亚洲精品免费网站| 日本亚洲欧美三级| 色婷婷av一区二区三区久久| 国产精品色婷婷视频| 精品亚洲男同gayvideo网站| 成人亚洲综合色就1024| 奇米成人av国产一区二区三区| 日韩动漫免费观看电视剧高清| 亚洲色图25p| 另类专区欧美制服同性| 亚洲网址你懂得| 国产丝袜精品视频| 精品日本美女福利在线观看| 国产精品人成电影| 国产精品电影一区| 国产91精品最新在线播放| 高清一区二区三区日本久| 午夜免费在线观看精品视频| 一夜七次郎国产精品亚洲| 136fldh精品导航福利| 中文字幕一精品亚洲无线一区| 91精品国产色综合| 精品国产欧美成人夜夜嗨| 国产精品国模在线| 日韩成人黄色av| 欧美日韩免费网站| 国产999精品久久久影片官网| 国产精品亚洲美女av网站| 久久久久久国产精品三级玉女聊斋| 亚洲电影在线看| 久久99热精品这里久久精品| 中文字幕欧美亚洲| 青草青草久热精品视频在线观看| 久久久爽爽爽美女图片| 91wwwcom在线观看| 91久久中文字幕| 亚洲欧美国产一区二区三区| xx视频.9999.com| 国产欧美日韩专区发布| 久久久欧美精品| 国产精品久久久久久久久久久久久久| 欧美色播在线播放| 色偷偷888欧美精品久久久| 欧美午夜www高清视频| 91欧美精品成人综合在线观看| 美女999久久久精品视频| www.欧美精品一二三区| 在线观看日韩www视频免费| 日韩av一卡二卡| 亚洲成人精品在线| www亚洲欧美| 久久精品国产91精品亚洲| 亚洲www在线| 欧美激情视频一区二区| 国产精品高潮呻吟久久av无限| 国产精品18久久久久久麻辣| 热久久免费国产视频| 91久久久久久久一区二区| 欧美日韩在线免费观看| 日韩中文字幕在线| 亚洲天堂av综合网| 欧美高清视频在线| 国产精品av网站| 欧美巨猛xxxx猛交黑人97人| 日韩欧美亚洲范冰冰与中字| 久久久亚洲精品视频|