最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

int a[3];

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

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

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

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

int calendar[12][31];

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

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

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

*a=84;

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

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

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

讓我們回過(guò)頭來(lái)再看幾個(gè)聲明:

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

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

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

p=calendar[4];

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

i = calendar[4][7];

我們確實(shí)也可以這樣做。還是與前面類似的道理,這個(gè)語(yǔ)句可以寫成下面這樣而表達(dá)式的意思保持不變:

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

這個(gè)語(yǔ)句還可以進(jìn)一步寫成:

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

從這里我們不難發(fā)現(xiàn),用方括號(hào)的下標(biāo)形式很明顯地要比指針來(lái)表達(dá)簡(jiǎn)便得多。下面我們?cè)倏矗?br />

p = calendar;

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

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

int (*ap)[31];

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

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

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

假定在新的一年開(kāi)始時(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指向一個(gè)擁有31個(gè)整型元素的數(shù)組,而calendar的元素也是一個(gè)擁有31個(gè)整型元素的數(shù)組,因此就像是在其他情況中我們可以使用一個(gè)指針遍歷一個(gè)數(shù)組一樣,這里我們同樣可以使用指針monthp以步進(jìn)的方式遍歷數(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語(yǔ)言泛型編程實(shí)例教程

    C語(yǔ)言泛型編程實(shí)例教程

    這篇文章主要介紹了C語(yǔ)言泛型編程,針對(duì)泛型的用法做了深入淺出的實(shí)例介紹,是C程序設(shè)計(jì)中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • C++連接mysql的方法(直接調(diào)用C-API)

    C++連接mysql的方法(直接調(diào)用C-API)

    首先安裝mysql,點(diǎn)完全安裝,才能在在安裝目錄include找到相應(yīng)的頭文件,注意,是完全安裝,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言函數(shù)調(diào)用堆棧詳情分析

    C語(yǔ)言函數(shù)調(diào)用堆棧詳情分析

    這篇文章主要介紹了C語(yǔ)言函數(shù)調(diào)用堆棧詳情分析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • C++ 在 Unreal 中為游戲增加實(shí)時(shí)音視頻互動(dòng)的教程詳解

    C++ 在 Unreal 中為游戲增加實(shí)時(shí)音視頻互動(dòng)的教程詳解

    這篇文章主要介紹了C++ 在 Unreal 中為游戲增加實(shí)時(shí)音視頻互動(dòng)的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • C++回溯算法之深度優(yōu)先搜索詳細(xì)介紹

    C++回溯算法之深度優(yōu)先搜索詳細(xì)介紹

    回溯在迷宮搜索中使用很常見(jiàn),就是這條路走不通,然后返回前一個(gè)路口,繼續(xù)下一條路。回溯算法說(shuō)白了就是窮舉法,下面讓我們一起來(lái)看看回溯算法中深度優(yōu)先搜索吧
    2023-01-01
  • Libevent的使用及reactor模型詳解

    Libevent的使用及reactor模型詳解

    Libevent?是一個(gè)用C語(yǔ)言編寫的、輕量級(jí)的開(kāi)源高性能事件通知庫(kù),主要有以下幾個(gè)亮點(diǎn):事件驅(qū)動(dòng)(?event-driven),高性能;輕量級(jí),專注于網(wǎng)絡(luò),這篇文章主要介紹了Libevent的使用及reactor模型,需要的朋友可以參考下
    2024-03-03
  • C語(yǔ)言超詳細(xì)講解函數(shù)棧幀的創(chuàng)建和銷毀

    C語(yǔ)言超詳細(xì)講解函數(shù)棧幀的創(chuàng)建和銷毀

    我們知道c語(yǔ)言中函數(shù)都是被調(diào)用的,main函數(shù)里面能調(diào)用其他函數(shù),其實(shí)main函數(shù)也是被別的函數(shù)調(diào)用的,下面通過(guò)本文給大家分享c語(yǔ)言函數(shù)棧幀的創(chuàng)建和銷毀過(guò)程,一起看看吧
    2022-05-05
  • 詳解Matlab如何繪制圓角半透明圖例

    詳解Matlab如何繪制圓角半透明圖例

    目前MATLAB的legend圖例是不支持圓角和半透明的,所以本文將自制實(shí)現(xiàn)圓角半透明圖例。文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • C++輸出問(wèn)題:保留兩位小數(shù)

    C++輸出問(wèn)題:保留兩位小數(shù)

    這篇文章主要介紹了C++輸出問(wèn)題:保留兩位小數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語(yǔ)言如何計(jì)算一個(gè)整數(shù)的位數(shù)

    C語(yǔ)言如何計(jì)算一個(gè)整數(shù)的位數(shù)

    這篇文章主要介紹了C語(yǔ)言如何計(jì)算一個(gè)整數(shù)的位數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論

乌兰县| 额济纳旗| 武鸣县| 平乡县| 绵阳市| 融水| 九江市| 灌南县| 小金县| 博白县| 乐至县| 余江县| 包头市| 迭部县| 忻州市| 襄垣县| 宝兴县| 阜南县| 石河子市| 龙里县| 光泽县| 冷水江市| 龙门县| 绍兴市| 嵊泗县| 华坪县| 依兰县| 金平| 潜江市| 灵璧县| 青海省| 嘉定区| 鄂托克旗| 米易县| 麦盖提县| 莱州市| 抚远县| 海口市| 长汀县| 桂阳县| 汾西县|