?

淺析C指針和一維、二維數組之間的關系

2017-11-15 11:28張龍波
電腦知識與技術 2017年28期
關鍵詞:數組指針函數

張龍波

摘要:指針是C語言的靈魂;熟練掌握指針的使用方法就可以直接操縱內存,使得程序的執行效率得到極大提高,從而我們可以編制出高效、簡潔、優秀的指令代碼。根據實踐教學經驗,仍有較多C語言學習者對指針和數組二者之間的關系掌握的不夠清晰,下面力求通過最簡潔、最高效的敘述方式,使大家耳目一新,豁然開朗!

關鍵詞:指針;數組;數組指針;函數

中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)28-0071-02

1 C指針和一維數組之間的關系

首先分析一維數組中每個數組元素在內存中的存儲狀態:假設有一整型數據類型的一維數組a,其定義及初始化語句如下:“int a[4]={-1,2,-3,4};”。其在內存中的邏輯狀態存儲示意圖如下所示(以表格形式展示):

(各個數組元素值會從高字節地址到低字節地址、按其補碼格式存入內存單元格)

因為普通的指針變量只能指向相同數據類型的普通變量!數組元素的本質就是一個一個的普通變量,所以我們可以定義一個整型指針變量p,讓它指向數組a的第一個數組元素:int* p=&a[0];//或“int* p=a;”。至此,我們可以通過main1函數清晰、直觀地觀察到數組a中元素在內存中的存儲狀態。

這里需要強調的是數組名a是一個指針常量,其值是固定的,不可以修改(如上方表格中的一維數組名a等價于&a[0],等價于0x18FF1001),而p是一個指針變量,其值是可以修改的!如果代碼中出現a++、++a、a—、—a都是錯誤的!

2 C指針和二維數組之間的關系

首先分析二維數組中每個數組元素在內存中的存儲狀態:假設有一整型數據類型的二維數組a,其定義及初始化語句如下:“int b[2][2]={{10,-20},{30,-40}};”。其在內存中的邏輯狀態存儲示意圖如下所示(以表格形式展示,請注意,C語言編譯器是按行逐一將元素在內存中存儲表示的?。?/p>

前已敘述:普通的指針變量只能指向相同數據類型的普通變量!數組元素的本質就是一個一個的普通變量,所以我們也可以定義一個整型指針變量p,讓它指向數組b的第一個數組元素b[0][0]:int* p=&b[0][0];//或“int* p=b[0];”//或“int* p=*b;”。

讀者可能會提出為何“int* p=*b;”是正確的呢?因為*b是對b這個指針常量取內容的!所以*b的值就是b[0],而b[0]是指向其內部的2個元素對象的第一個元素對象b[0][0]的?。ㄇ杏洸豢梢詫懽鳎骸癷nt* p=b;”,因為b是一個指針常量,它指向其第一個數組元素b[0]、并不是指向數組元素b[0][0]的?。?。至此,我們也可以通過如下的main2函數清晰、直觀地觀察到數組b中元素在內存中的存儲狀態。

3 “數組指針”和一維、二維數組之間的關系

以上兩部分介紹的都是普通指針變量指向一維、二維數組中具體的數組元素時發生的關系,下面我們有必要討論一種特殊的指針——“數組指針”,它和數組之間又會發生怎樣的“化學反應”呢?(所謂數組指針就是專門用來指向數組的某行的指針?。?/p>

以上函數代碼解釋如下:

第1行的作用是:定義一個一維的整型數組a,并且對其6個數組元素進行初始化!

第2行的作用是:定義一個數組指針變量p,它是一個只能指向“包含有6個元素的一維數組”的指針變量!

第3行的作用是:讓p去指向一維數組a的所有元素,即讓p去指向一行數據!

第4行的作用是:打印出&a、a、&a[0]三個指針常量的值,可以發現它們是相同的!

第5、6行的作用是:利用數組元素名打印出所有元素值!注意:C在編譯時會把a[i]轉換為*(a+i)處理!

第8、9行的作用是:利用數組指針變量p打印出所有元素值!“(*p)[i]”的含義是:p所指向的行中序號為i的元素!

第10行的作用是:讓p加1,p就一下子跳過了整個的一維數組中的所有元素!

第11行的作用是:觀察p的值,發現p的值必定比&a[0]的值大0x18(即跳過了24個字節的單元格地址)!

main4函數的倒數第3行代碼中的“*(p+i)+j”需要我們好好研究!“*(p+i)+j”指的是第i行第j列數組元素的地址?。ㄓ捎趐是指向行的數組指針變量,所以*(p+i)的作用就是“將第i行的行指針取星號降為指向b[i][0]的列指針”,“*(p+i)”再加上列控制變量j的值,即為元素b[i][j]所占內存字節的首地址?。?/p>

指針是C語言的特色及精華,其使用方法千變萬化,需要我們所有喜愛C語言的編程人員更加深入透徹的學習!

參考文獻:

[1] 黑馬程序員[EB/OL].www.iqiyi.com.

[2] C語言從菜鳥到高手[EB/OL].www.bilibili.com.

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

[4] 明日科技.C語言從入門到精通[M].2版.北京:清華大學出版社,2011.

[5] Stephen Prata. C Primer Plus[M].6版.北京:人民郵電出版社,2015.endprint

猜你喜歡
數組指針函數
JAVA稀疏矩陣算法
二次函數
二次函數
函數備考精講
JAVA玩轉數學之二維數組排序
Excel數組公式在林業多條件求和中的應用
尋找勾股數組的歷程
基于改進Hough變換和BP網絡的指針儀表識別
ARM Cortex—MO/MO+單片機的指針變量替換方法
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合