999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

深入淺出理解C語言指針與二維數組

2019-09-24 02:00:29黃寶貴禹中元
電腦知識與技術 2019年19期

黃寶貴 禹中元

摘要:指針是C語言的特色,也是C語言的靈魂與精華,熟練使用指針可以提高編程效率。指針與數組具有密切的關系,使用指針訪問數組可以優化程序代碼,提高程序的執行效率。但是,由于二維數組結構復雜,初學者難以理解其中的概念,指針與二維數組之間的關系比較模糊,增加了使用指針訪問二維數組元素的難度。該文結合生活中的示例深入淺出地解析指針與二維數組之間的關系,使用多種類型的指針訪問二維數組,并指出其中的難點及容易混淆之處。

關鍵詞:C語言;地址;指針;二維數組;元素訪問

中圖分類號:TP312? ? ?文獻標識碼:A

文章編號:1009-3044(2019)19-0082-03

Abstract: Pointers are the most important characteristic and regarded as the soul and the best feature of the C programming language. The efficiency of C programs is improved significantly if pointers are good used in them. Pointers and arrays are closely related and they usually lead to more compact and efficient code. However, it is difficult to the abecedarians to understand the concept of pointers and two dimensional arrays because of their complicated structure. The obscure relationship between the point and array increases the hardness of visiting the elements of array by using pointers. The relationship between the point and array is analyzed with a simple way in this paper. The elements of a two dimensional array can be visited by several different type pointers. Moreover, some key and easily confused problems are listed in this paper.

Key words: C programming language; address; pointer; two dimensional array; element visited

1 背景

教授我們C語言的老師曾經說過:沒有真正掌握指針的使用,就不能說已經學好C語言!由此可見指針在C語言中的重要地位。事實上,指針是C語言最重要的特色,是C語言的精華。指針概念繁多,使用非常靈活,這也導致我們在初學C語言時難以掌握其概念及使用方法。指針與數組具有密切的關系,指針通常與數組放在一起討論與學習[1]。任何使用數組下標訪問的表達式都可以使用指針來代替。但是,由于二維數組結構相對復雜,加之指針的靈活多變性,用指針訪問二維數組的元素有多種方法,是我們學習的難點。下面,結合我們體育課上同學們站隊的情形,詳細討論用一級指針,二級指針,指向一維數組的指針及指針數組來訪問二維數組元素的具體操作過程。

我們班有20名同學,每一位同學都有一個編號,用整數[i]表示,[i∈[0,19]]。我是體育委員,我的編號是0。站隊時,每5位同學站成一排,一共站4排。因為數組下標從0開始計數,為了后續敘述方便,我們規定最前面一排稱為第0排,往后分別是第1排,第2排,第3排。第0排的同學的編號從左到右分別是[0,1,2,3,4];第1排的同學的編號從左到右分別是[5,6,7,8,9];……,依次類推。每一排的第一位同學所在的位置稱為這排同學站隊的地址,其后的同學的地址由排頭同學的地址決定。我是體育委員,我所站立的位置決定了我們班所有同學站隊的地址。假設張三同學編號是13,他站在第2排第3個位置。那么,體育老師要想找到張三同學,該怎么做呢?

以上問題用二維數組建立一個如下數學模型。二維數組a[4][5],a[0][0]=0,a[0][1]=1,…,a[0][4]=4,a[1][0]=5,…,a[1][4]=9,…,a[2][3]=13,…,a[3][4]=19。數組a可用二維表1表示。事實上,根據數組在計算機內存中的表示方法,這20個元素在計算機內存中按先行后列的方式進行存儲[2]。

2 用指向整型的指針訪問

體育老師只知道我所站立的位置,他必須首先找到我的位置,因為我決定了全班同學所站隊列的位置。然后,從我開始向左依次走過每一位同學,走過第0排的5位同學后再從第1排的排頭開始依次走過5位同學,然后再從第2排的排頭開始依次走過3位同學,這時體育老師就走到了張三同學的位置,找到了張三同學。這種情況下,體育老師每次只面對一個同學,體育老師每走一步只走過一位同學,而張三的前面有13位同學,體育老師需要走13步才能到達張三的位置。可以把體育老師理解為指向某位同學的指針(指針即地址[3],是同一概念的兩種說法),老師每走過一位同學,該指針值加1。那么,值13又是怎么得到的呢?a[2][3]元素在第2行,第3列(再次注意到,從0開始計數)。它的前面還有2個整行(第0行和第1行),每行有5個元素。而張三所在的行上,a[2][3]之前還有3個元素。所以a[2][3]之前總共有2*5+3=13個元素。用C語言描述如下。其中,(1):表示代碼的行標。下同。

(1):int *p;? ?//p是指向int型數據的指針

(2):p = &a[0][0];? //指針p賦值為a[0][0]的地址,即p指向元素a[0][0]

(3):p = p + (2*5+3);? //p指針右移13步,指向元素a[2][3]

(4):*p ;? ? //指針解引用,得到指針所指向的內容,即張三的編號13

事實上,第2行代碼可以寫成:p = a[0],但不可以寫成 p = a。&a[0][0]表示元素a[0][0]的地址,即指向a[0][0]的指針。根據一維數組元素及指針的關系,如果把a[0][0]看作為b[0]的形式,則b就是a[0]。而b[0]的指針就是b+0,即b。所以,a[0][0]的指針可以理解為指針a[0]+0即a[0]。所以,第2行代碼寫成p = a[0]也是正確的。但是,如果p = a,則*p=*a,而*a=*(a+0)=a[0]。根據指針p的定義,*p應該是指針p所指向的內容,是個整數。但,a[0]不是整數,是指針。

3 用指向一維數組的指針訪問

體育老師忽然發現,既然已經知道張三同學在第2排,那么不需要從第1個同學開始依次走過前13名同學。體育老師可以從第0排開始直接越過2排走到第2排的排頭位置。在這種情況下,體育老師的“眼界”變寬,他一眼能看到一排同學,一排同學可看作是個一維數組。這樣,體育老師每走一步就跨過一排同學。而張三在第2排中位于下標為3的位置。用C語言描述如下。

1):int (*p)[5]; //p是指向具有5個元素的一維數組的指針。

2):p = a;? ?//指針指向二維數組的首地址。

3):p = p + 2; //指針p指向第2行數組

4):(*p)[3];? // *p是p指向的內容,即一維數組,而下標為3的元素就是張三的編號

第2行代碼不能寫成:p = a[0]或者p=&a[0][0]。因為,如果p=a[0],則*p=*(a[0])。而*p是指向數組的指針,*(a[0])=*(a[0]+0)=a[0][0]是個整數。同理,p=&a[0][0]也是錯的。

4 用二維數組名作為指針訪問

體育老師生病,由我代替他上課。作為班級體育委員,我(數組名a)當然代表的是全部同學啦。我把同學們分成4個小組,每一排作為一個小組,隊形不能亂!每一排可以看作一維數組。這樣,我們班就可以看作4個一維數組了。每一排的排頭同學直接向我負責,由排頭同學幫我找到這一排中的其他同學。這樣,可以把二維數組a折分為4個一維數組[4]。如圖1所示。這4個一維數組的名字分別是a[0],a[1],a[2],a[3]。而一維數組的名字又代表數組的首地址,即a[0]是指向a[0][0]的指針。而且,a[0]+1,a[0]+2,a[0]+3和a[0]+4分別是指向元素a[0][1],a[0][2],a[0][3]和a[0][4]的指針。稱它們為列指針。顯然,a[0],a[1],a[2]和a[3]又是數組a的4個元素。數組名a是指向該數組的指針,而且a+1,a+2,a+3分別是指向元素a[1],a[2]和a[3]的指針。稱它們為行指針。

5 用指針數組訪問

體育老師不需要知道全班同學站隊的位置,只需要知道每一排的排頭位置,把這些位置記在心里,然后根據這些位置就可以找到每一排中的任意一位同學了。根據第4小節的分析,a[0],a[1],a[2]和a[3]是4個地址(指針),分別表示4行一維數組的地址。可以定義一個有4個元素的數組,每個元素值都是指針,用它存儲a[0],a[1],a[2]和a[3]的值。這種數組稱為指針數組。C語句序列如下。

(1):int *p[4]; //定義數組p,有4個元素,每個元素是指向int型的指針

(2):int i;? //定義int型變量

(3):for(i = 0; i < 4; i++) p[i] = a[i]; //把a[0],a[1],a[2]和a[3]的值存儲到數組p中

(4):*(p[2]+3); //元素a[2][3],即張三

第3行的命令不能簡寫為p=a。因為,p是指針數組的名字,而數組名是常量,不能直接進行賦值運算。

6 結束語

指針的概念繁多,定義形式有多種,不同的定義形式表達不同的含義,有些定義形式相近但意義有很大的差別。如,int (*p)[5] (數組指針,p是指向一維數組的指針)、int *p[5] (指針數組,p是由5個元素組成的數組,每個元素是指向整型數據的指針),int (*p)(float x) (函數指針,p是指向函數的指針),int *p(float x) (返回指針值的函數,p是函數名)等。這些形似義異的定義使得指針的使用非常復雜,給初學者帶來極大的困難。指針及二維數組的關系密切,二維數組元素的訪問可以用指針完成。而且,有多種實現方法,每種方法在具體使用中有許多需要注意的問題,在學習的時候要注意其區別。

參考文獻:

[1] Kernighan B W, Ritchie D M. The C Programming Language(C程序設計語言)[M]. 2版. 徐寶文, 李志, 譯. 北京: 機械工業出版社, 2012.

[2] 張龍波. 淺析C指針和一維、二維數組之間的關系[J]. 電腦知識與技術, 2017, 13(28): 71-72.

[3] 張憶文. C語言指針教學難點透析[J]. 計算機教育, 2017(1): 155-156.

[4] 譚浩強. C程序設計[M]. 4版. 北京: 清華大學出版社, 2010.

[5] 段紅義. C語言指針教學中常見錯誤分析[J]. 電腦知識與技術, 2017, 13(4): 77-78.

【通聯編輯:謝媛媛】

主站蜘蛛池模板: 国产又粗又猛又爽视频| 亚洲中文字幕97久久精品少妇| 一级黄色网站在线免费看| 青青草原国产一区二区| 亚洲系列中文字幕一区二区| 五月天福利视频| 四虎成人精品| 青草午夜精品视频在线观看| 99久久精品免费看国产电影| 无码高清专区| 成人日韩精品| 亚洲无码在线午夜电影| 99ri国产在线| 国产成人精品一区二区免费看京| 国产精品亚洲专区一区| 国产成人精品一区二区免费看京| 999国内精品久久免费视频| 夜精品a一区二区三区| 狠狠做深爱婷婷久久一区| 国产激爽大片在线播放| 国产成人精彩在线视频50| 亚洲三级电影在线播放| 亚洲天堂精品在线观看| 国产va在线观看| 午夜国产在线观看| 国产伦片中文免费观看| 91久久精品日日躁夜夜躁欧美| 国产av色站网站| 久久精品人人做人人爽电影蜜月| 国产av一码二码三码无码| 55夜色66夜色国产精品视频| 午夜无码一区二区三区| 国产成人啪视频一区二区三区| 人妖无码第一页| 国产成人综合在线观看| 在线观看免费黄色网址| 亚洲大尺码专区影院| 天天综合亚洲| 亚洲中文字幕av无码区| 亚洲色图综合在线| 精品成人一区二区三区电影| 91精品伊人久久大香线蕉| 国产激爽大片高清在线观看| 亚洲精品成人7777在线观看| 日韩毛片在线播放| 午夜视频免费试看| 国产成本人片免费a∨短片| 国产丰满大乳无码免费播放| 免费在线看黄网址| 久久综合色视频| 欧洲欧美人成免费全部视频| 午夜精品一区二区蜜桃| 免费可以看的无遮挡av无码 | www.亚洲一区二区三区| 精品国产三级在线观看| 成人一级黄色毛片| 青草精品视频| 日韩精品视频久久| 欧美日本在线| 秋霞午夜国产精品成人片| 欧美日韩国产综合视频在线观看| 美女被操黄色视频网站| 在线国产三级| 久久久精品国产亚洲AV日韩| 国产一级妓女av网站| 亚洲美女AV免费一区| 鲁鲁鲁爽爽爽在线视频观看| 久久性视频| 午夜福利在线观看成人| 成人在线综合| 嫩草影院在线观看精品视频| 精品视频一区在线观看| 色欲不卡无码一区二区| 欧美区国产区| 日韩精品无码一级毛片免费| av在线人妻熟妇| 中国国产高清免费AV片| 人人爱天天做夜夜爽| 国产乱人伦精品一区二区| 婷婷中文在线| 99在线观看视频免费| 无码中文字幕精品推荐|