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

首頁 > 學院 > 開發設計 > 正文

再談C語言中數組和指針之間的互操作

2019-11-17 05:18:35
字體:
來源:轉載
供稿:網友

  我曾說過,在C語言中只有一維的數組(這是我對數組的看法),而且數組元素可以是任何類型的數據(或對象),自然也可以是另外的一個數組(因為數組也是一種數據類型)。所以假如你堅持要說有多維數組,那也不是不可能的事情。我們只要把一個數組賦值給另一個數組的元素就可以了。當然了,我們必須保證在程序編譯期數組的大小是一個固定的常數。

  其實,數組的操作很簡單的。只要我們確定一個數組的大小和指向該數組下標為0的元素的指針,其他的任何一個數組下標的運算都等同于一個對應的指針運算,所以我們說“數組和指針是可以相互操作的”。兩者的本質是一樣的。甚至我們還可以把數組看作是一個“指針”的集合。

  我可以通過如下的方式聲明一個數組:

char name[10];
  這個語句聲明了name是一個擁有10個字符型元素的數組。類似的

strUCt student{
int tid[4];
char name[10];
char sex;
char address[25];
} std[100];
  這里聲明了std是一個擁有100個元素的數組,而且std中的每一個元素都定義了一名學生的基本信息,每一個元素都是一個結構,其中包括一個擁有4個整形元素的數組(tid[4]),用來記錄學生的學好;還有一個擁有10個字符型元素的數組(name[10]),用來記錄學生的名字;一個用來記錄學生性別的字符(sex);還有一個記錄學生住址,擁有25個字符型元素的數組(address[25])。數組是一個很靈活的結構。

  所謂的“二維數組”或“矩陣”是很輕易聲明的,例如:

int week[7][24];
  這里把聲明week聲明為一個擁有7個數組元素的數組(這樣解釋,不會感覺奇觀吧),其中每一個元素都是擁有24個整數型元素的數組。注重了不能把week理解為一個擁有24個數組元素的數組,其中每一個元素是一個擁有7個整形元素的數組。 還有,假如week不是用于sizeof的操作數,那么它總是被一個指向week數組起始地址的指針。這里又和指針磨合了。 假如一個指向的是一個數組的一個元素,那么我們只需給這個指針加上一個自然數i(0 =<i <數組的上邊界的值),那么就可以得到一個指向該數組的弟i個元素的指針。假如在此基礎上減去1,那么就得到了一個指向前一個元素的指針。這樣的操作很簡單很靈活的。但是這兒也有一個誤區:好多人都認為“給一個指針加一個整數,就等同于給該指針的二進制數表示加上一個同樣的整數”。其實,這是一個很輕易犯的錯誤了,至少在初學C語言的時候,我就犯過這個錯誤,而且不僅一次。其實,這兩者的含義是截然不同的。假設我們有一個這樣的指針聲明語句:

int *p;
  那么p自然是一個指向整數指針了,那么p+1指向的是計算機內存的下一個整數,而不是指向指向地址的下一個內存位置。也就是說程序的邏輯地址一般都不同于實際的物理地址。

  假如有兩個指向同一個數組的元素,那么我們可以通過這兩個指針之間的算術運算得到一些有意義的表達式。 比如,

int *pointer;
int *ip = pointer + i;
  那么我們可以通過指ip-pointer得到i的值。假如ip和ponter指向的不是同一個元素,那么我們就無法保證這個操作的正確性,雖然他們在內存地址上相差一個整數倍。

  讓我們通過下面的一個例子來看看數組和指針操作的等效性和靈活度:

  假如我們在程序中聲明了以下兩個語句,

int a[12];
int *p;
  那么我們可以對數組和指針進行相應的操作了:

(1) p = a;

  因為a = a[0],所以這里就有p=a[0]了,即p和a都指向數組的第一個元素;

(2) p = p + 1;

  這也是正確的。它等效于p = a[1];

(3) p++;

  這個語句等效于 p = a[2];

  還有:

  p = &a; 這樣的語句ANSI C中是錯誤的,這一點在前一篇文章我已經聲明過,因為這兩個操作數的類型很顯然是不匹配的,即&a是一個指向數組的指針而p是一個整型指針。所以此類操作是非法的。有時可能會僥幸的通過(因為有些編譯器提供商不一定嚴格的按照ANSI C的保準來開發自己的編譯器),但是我們不提倡這種做法。

  數組元素的引用

  這是一個足夠讓人糊涂的問題。先看一看下面這個語句是否正確:

a + i = a + i;
  也許你會說很顯然是正確的,因為它非凡象一個兩元加法運算。雖然答案的前一半是正確的,但是問題的實質可不是這樣的。為了回答之一個 問題我們需要從數組元素的引用說起。

  在前面我們聲明了a為一個擁有12個整型元素的數組,而且我們知道a是一個指向該數組的第一個(0位元素)元素的指針,所以按照指針的性質我們可以知道*a就是對數組的第一個元素的引用。你可以通過如下的方式給數組的第一個元素賦值:

*a = 2005;
  明白了這一點,那么其他元素的賦值和引用也是類似的。*(a+3)是對數組的弟3個元素的引用,而其賦值可以是:

*(a+3) = 2006;
  然而,由加法的交換律,可以知道1+a = a+1,所以a+i = i+a;

  因為 *(a+i) = *(i+a)。

  現在讓我們想一想如何用指針來操作我們的二維數組吧。

  前面我們聲明了一個二維數組week,那么week[2]代表什么意思呢?我想假如明白了前面的講解,那么這個問題就一如反掌了。week[2]代表的無非就是week數組的弟3個元素(數組下標從0開始),即一個擁有24個整型元素的數組。假如你還想知道week[2]的內存大小,那么你可以通過sizeof操作來實現:

int mem;
mem = sizeof(week[2]);
  其實,sizeof(week[2]) = 24 * sozeof(int)。

  假如你想通過指針來訪問week[2]的元素(這里假設訪問弟3個元素),那也是很簡單的。請看下面的表達式:


int value;
p = week[3];

value = *(p+3);
  也可以是:

value = week[2][2];
  或者

value = *(week[2]+3);
  還可以是:

value = *(*(week+2)+3);
  由此我們可以看出來,數組和指針不是兩個相互獨立的結構,而是緊密緊密互不可分的整體。兩者之間的互操作是最美的結合。我們提倡只在程序設計中才用數組和指針之間的互操作的實現方法。到這里我們的旅程也該結束了,假如說還有一些技術沒有提及,我想那自然是數組和指針分別作為函數返回值類型和函數參數的情形罷了。其操作和上面提到的相當,在此就不提了。一般我們習慣于把指針當作函數返回值類型和函數參數來處理的,而不是處理數組,因為在這種情形下,對數組的操作顯得很笨拙很底效。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
不卡av日日日| 久久色在线播放| 日av在线播放中文不卡| 欧美老女人bb| 国产69精品久久久久9| 88国产精品欧美一区二区三区| 日韩欧亚中文在线| 一级做a爰片久久毛片美女图片| 亚洲深夜福利网站| 亚洲国产欧美在线成人app| 午夜精品在线视频| 精品国产乱码久久久久酒店| 亚洲精品电影网站| 97国产精品视频| 97精品国产91久久久久久| 亚洲午夜小视频| 欧美成人亚洲成人| 欧美激情videoshd| 欧美日韩国产在线| 国产亚洲美女久久| 97国产精品久久| 欧美另类69精品久久久久9999| 日韩小视频网址| 欧美成人sm免费视频| 亚洲精品在线视频| 欧美性xxxx| 最近2019年好看中文字幕视频| 国产精品美女网站| 色久欧美在线视频观看| 成人国产亚洲精品a区天堂华泰| 亚洲美女www午夜| 日韩欧美在线视频日韩欧美在线视频| 美女黄色丝袜一区| 欧美亚洲成人xxx| 91精品国产91久久久| 欧美激情在线观看视频| 91av在线免费观看视频| 欧美麻豆久久久久久中文| 91精品国产自产在线观看永久| 日韩综合中文字幕| 日韩大片在线观看视频| 91香蕉嫩草神马影院在线观看| 久久精品成人一区二区三区| 国产成人激情小视频| 国产在线观看91精品一区| 亚洲国产成人久久| 正在播放欧美一区| 国产精品一区二区三区免费视频| 国产精品视频26uuu| 久久国产精品亚洲| 中文字幕日韩高清| 亚洲国产成人一区| 欧美亚洲另类在线| 成人黄色免费看| 日韩精品免费综合视频在线播放| 国产精品国产福利国产秒拍| 国产成人精品免费视频| 国产手机视频精品| 国产精品吴梦梦| 成人激情视频在线| 久久久久久噜噜噜久久久精品| 国产精品无码专区在线观看| 精品国内自产拍在线观看| 日韩美女av在线| 91精品国产91久久久久久不卡| 亚洲视频在线免费观看| 一本色道久久综合亚洲精品小说| 国产成人福利视频| 亚洲美女黄色片| 91精品啪在线观看麻豆免费| 91亚洲一区精品| 91精品国产91久久久久久最新| 亚洲视屏在线播放| 久久国产精品亚洲| 欧美交受高潮1| 日韩欧亚中文在线| 亚洲japanese制服美女| 亚洲a级在线观看| 国产精品精品国产| 久久久噜噜噜久噜久久| 久久黄色av网站| 一二美女精品欧洲| 国产国语刺激对白av不卡| www.日本久久久久com.| 久久久精品一区| 在线观看日韩欧美| 欧美日韩在线视频首页| 热久久99这里有精品| 国产精品色午夜在线观看| 国产偷亚洲偷欧美偷精品| 国产精品a久久久久久| 久久国产精品亚洲| 亚洲国产91精品在线观看| 2024亚洲男人天堂| 午夜精品一区二区三区在线| 精品久久久av| 国产精品∨欧美精品v日韩精品| 精品福利视频导航| 人人爽久久涩噜噜噜网站| 亚洲欧美国产精品专区久久| 亚洲人成毛片在线播放| 国产精品色午夜在线观看| 91产国在线观看动作片喷水| 亚洲精品久久7777777| 午夜精品久久久久久99热软件| 奇米一区二区三区四区久久| 欧美成人免费在线视频| 国产一区二区动漫| 日韩在线视频国产| 国产精品久久久久久av| 亚洲bt天天射| 91久久夜色精品国产网站| 日韩中文字幕网站| 上原亚衣av一区二区三区| 2024亚洲男人天堂| 亚洲性视频网址| 97国产精品视频| 国产精品国产亚洲伊人久久| 国产精品久久综合av爱欲tv| 亚洲第一男人天堂| 成人午夜高潮视频| 亚洲人成电影在线| 久久偷看各类女兵18女厕嘘嘘| 亚洲天堂日韩电影| 国产精品伦子伦免费视频| 国产精品女主播视频| 欧美精品18videos性欧| 亚洲精品美女久久久| 日韩网站在线观看| 久久久亚洲欧洲日产国码aⅴ| 久久在线免费观看视频| 国产精品自产拍在线观| 日韩在线观看视频免费| 亚洲开心激情网| 69久久夜色精品国产7777| 欧美在线视频在线播放完整版免费观看| 中文字幕日韩专区| 尤物99国产成人精品视频| 最近2019中文字幕一页二页| 日韩国产激情在线| 成人av.网址在线网站| 日韩欧美高清在线视频| 日韩激情av在线免费观看| 久久久精品一区| 中文字幕亚洲欧美一区二区三区| 精品在线观看国产| 91精品国产乱码久久久久久久久| 欧美一区二区三区免费视| 国产精品亚发布| 欧美色videos| 国产精品xxxxx| 成人午夜激情免费视频| 日韩免费视频在线观看| 欧美日韩一区二区免费视频| 久久久免费电影| 国模精品系列视频| 欧美日韩中文字幕在线视频| 欧美最顶级的aⅴ艳星| 亚洲国产欧美久久| 高清欧美性猛交xxxx黑人猛交| 中文字幕亚洲综合久久筱田步美| 97久久精品人搡人人玩| 国产成人高潮免费观看精品| 欧美一区二区.|