版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
拋出問題最近碰到一個(gè)問題點(diǎn),這里跟大家分享一下。有一個(gè)二維數(shù)組,我想把它傳給一個(gè)函數(shù)。于是我把函數(shù)接口定義出來了,如下:int
array[2][3]
=
{1,2,3,4,5,6};
void
fun(int
**array)
{
array[0][0]
=
5;
}當(dāng)我試圖直接把數(shù)組名傳給函數(shù)時(shí)候,fun(array)編譯會(huì)報(bào)錯(cuò),大概意思就是類型不匹配。既然類型不匹配,那我就直接強(qiáng)轉(zhuǎn)成你所需要的類型,于是我又做了調(diào)整,fun((int**)array),這下確實(shí)不報(bào)錯(cuò)了。但是此時(shí)我還沒意識到問題的嚴(yán)重性。不出意外的情況下意外還是發(fā)生了,只要進(jìn)入到這個(gè)函數(shù)后,程序就掛了。那你知道是什么原因嗎?如果不清楚就往下看吧...指針先從指針說起,指針是一個(gè)特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個(gè)地址。要搞清一個(gè)指針需要搞清指針的四方面的內(nèi)容:指針的類型、
指針?biāo)赶虻念愋?/p>
、
指針的值或者叫指針?biāo)赶虻膬?nèi)存區(qū)、
指針本身所占據(jù)的內(nèi)存區(qū)。指針的類型只要把指針聲明語句里的指針名字去掉,剩下的部分就是這個(gè)指針的類型。例如:int*ptr;
//指針的類型是
int*
char*ptr;
//指針的類型是
char*
int**ptr;
//指針的類型是
int**
int(*ptr)[3];
//指針的類型是
int(*)[3]指針?biāo)赶虻念愋椭豁毎阎羔樎暶髡Z句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針?biāo)赶虻念愋汀@纾篿nt*ptr;
//指針?biāo)赶虻念愋褪?/p>
int
char*ptr;
//指針?biāo)赶虻牡念愋褪?/p>
char
int**ptr;
//指針?biāo)赶虻牡念愋褪?/p>
int*
int(*ptr)[3];
//指針?biāo)赶虻牡念愋褪?/p>
int()[3]指針的值在32位程序里,所有類型的指針的值都是一個(gè)32位整數(shù),因?yàn)?2位程序里內(nèi)存地址全都是32位長。指針本身所占用的內(nèi)存大小意思是指針本身占了多大的內(nèi)存,在32位平臺里,指針本身占據(jù)了4個(gè)字節(jié)的長度??梢允褂胹izeof(指針的類型)測試。一維數(shù)組對于一個(gè)一維數(shù)組intarray[10],數(shù)組名代表一個(gè)常量地址,該地址指向第一個(gè)元素。以下兩種情況數(shù)組名不能當(dāng)指針使用。&對數(shù)組名取址,int(*p_array)[10]=&array,&這個(gè)運(yùn)算符也很有講究的,暫時(shí)不多說了。sizeofsizeof(array)計(jì)算的是整個(gè)數(shù)組在內(nèi)存中所占用的空間。二維數(shù)組二維數(shù)組本質(zhì)上是以數(shù)組作為數(shù)組元素的數(shù)組,即“數(shù)組的數(shù)組”。假設(shè)我們定義了一個(gè)二維數(shù)組intarray[2][3]={1,2,3,4,5,6}。網(wǎng)上有很多地方都再說數(shù)組名array和array[0]、&array[0]以及&array[0][0]是等效的。那我們代碼測試一下。printf("%#x,%#x,%#x,%#x\r\n",array,array[0],&array[0],&array[0][0]);
Terminal:
0x404008,0x404008,0x404008,0x404008因?yàn)檫@幾種寫法輸出地址都是相同的,所以有的同學(xué)自然就認(rèn)為這幾種寫法就是一樣的。雖然地址相同,但是實(shí)際意義是有區(qū)別的,我們繼續(xù)看下面的代碼。//這里重新定義了指針變量,能夠方便的知道右值得類型
int
*p_array1
=
array[0];
int
*p_array2
=
&array[0][0];
int
(*p_array3)[3]
=
&array[0];
int
(*p_array4)[3]
=
array;
printf("%#X,%#X,%#X,%#X,%#X\r\n",array,++p_array1,
++p_array2,
++p_array3,
++p_array4);
Terminal:
0X404008,0X40400C,0X40400C,0X404014,0X404014根據(jù)以上實(shí)驗(yàn)分析能夠看出:array[0]與&array[0][0]指針類型相同,都是int*,地址存放的是int數(shù)據(jù),當(dāng)指針自增1時(shí)地址都偏移了一個(gè)int類型的大小。&array[0]與array指針類型相同,都是int(*)[3],首先它是一個(gè)數(shù)組指針,這個(gè)指針指向一個(gè)數(shù)組,數(shù)組中數(shù)據(jù)的類型為int型。當(dāng)指針自增1時(shí)地址都偏移了一個(gè)數(shù)組的長度(即3個(gè)int數(shù)據(jù)的大小)。所以說array只和&array[0]真正意義等效。那怎么去理解這幾種表達(dá)呢?表示含義array是一個(gè)數(shù)組指針,類型為int(*)[3]。指向二維數(shù)組中第一個(gè)元素(元素是一維數(shù)組),指針?biāo)赶虻膬?nèi)存大小為一維數(shù)組的長度array[0]是一個(gè)指針,類型為int*。就相當(dāng)于一個(gè)一維數(shù)組名,指向一維數(shù)組中第一個(gè)元素的地址,指針?biāo)赶虻膬?nèi)存大小為一個(gè)數(shù)據(jù)長度&array[0]是一個(gè)數(shù)組指針,類型為int(*)[3]。相當(dāng)于對一維數(shù)組取地址。指針?biāo)赶虻膬?nèi)存大小為一維數(shù)組的長度&array[0][0]是一個(gè)指針,類型為int*,是對二維數(shù)組中第一個(gè)數(shù)據(jù)取地址,注意是數(shù)據(jù)不是元素,指針?biāo)赶虻膬?nèi)存大小為一個(gè)數(shù)據(jù)長度如以上能夠理解清楚,那么文中的問題應(yīng)該就能夠自己分析清楚了。二級指針先定義一個(gè)二級指針int**p,首先p是一個(gè)指針,在這個(gè)地址中存放的數(shù)據(jù)是指向一個(gè)整形數(shù)據(jù)的地址。問題解答接著看文章中的問題,把一個(gè)二維數(shù)組強(qiáng)轉(zhuǎn)成二級指針傳給了函數(shù)。注意二維數(shù)組名的類型是一個(gè)數(shù)組指針和二級指針完全不是一個(gè)東西。那么會(huì)出現(xiàn)什么問題呢?int
array[2][3]
=
{1,2,3,4,5,6};
int
main(int
argc
,char
**argv)
{
int
**p_data
=
(int
**)array;
printf("%#x,
%d\r\n",
p_data,
*p_data);
}
Terminal:
0x404008,
1地址數(shù)據(jù)0x40400810x40400C20x40401030x40401440x40401850x40401C6看上面的例子,array的地址為0x404008,當(dāng)把一個(gè)二維數(shù)組強(qiáng)轉(zhuǎn)成二級指針的時(shí)候。p_data地址中存放的數(shù)據(jù)為1,因?yàn)槎S數(shù)據(jù)中第一個(gè)數(shù)據(jù)就是1。根據(jù)二級指針的定義,這個(gè)數(shù)據(jù)1又會(huì)當(dāng)成一個(gè)地址,該地址指向的內(nèi)存才是最終的數(shù)據(jù)。但是呢,這個(gè)地址1其實(shí)是個(gè)數(shù)據(jù),并不是真正的地址。如果訪問地址1中的數(shù)據(jù),就屬于非法訪問地址了,可能會(huì)進(jìn)入異常。二維數(shù)據(jù)當(dāng)函數(shù)入?yún)⑼ㄟ^以上學(xué)習(xí)我們已經(jīng)知道二維數(shù)組名就是一個(gè)數(shù)組指針,我們函數(shù)就可以像下面這樣聲明。void
fun(int
array[][3],
int
row);
void
fun(int
(*p_array)[3],
int
row);
void
fun(int
row,
int
column,
int
array[row][column]);實(shí)參與入?yún)⒆詈笤诳聪?,?yīng)該如何定義與實(shí)參相對應(yīng)的形參的數(shù)據(jù)類型。含義實(shí)參形參二維數(shù)組
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津商務(wù)職業(yè)學(xué)院《篆刻臨摹與創(chuàng)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川機(jī)電職業(yè)技術(shù)學(xué)院《安裝工程預(yù)算》2023-2024學(xué)年第二學(xué)期期末試卷
- 北京語言大學(xué)《民法學(xué)(一)》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南推拿職業(yè)學(xué)院《物理化學(xué)B(下)》2023-2024學(xué)年第二學(xué)期期末試卷
- 開封文化藝術(shù)職業(yè)學(xué)院《遙感概論實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 南通理工學(xué)院《微生物學(xué)前沿進(jìn)展》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海海洋大學(xué)《國際商務(wù)談判實(shí)訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 二零二五年度2025年菜金發(fā)票開具與稅務(wù)籌劃服務(wù)合同
- 2025年耕地租賃合同附農(nóng)業(yè)土地經(jīng)營權(quán)抵押貸款服務(wù)協(xié)議
- 《招聘與應(yīng)聘技巧》課件
- 異地就醫(yī)備案的個(gè)人承諾書
- 2024-2030年中國ODM服務(wù)器行業(yè)市場發(fā)展分析及前景趨勢與投資研究報(bào)告
- 六年級下健康教案設(shè)計(jì)
- 室內(nèi)裝飾拆除專項(xiàng)施工方案
- 醫(yī)院院外會(huì)診申請單、醫(yī)師外出會(huì)診審核表、醫(yī)師外出會(huì)診回執(zhí)
- 鋼筋工程精細(xì)化管理指南(中建內(nèi)部)
- 2024年山西省高考考前適應(yīng)性測試 (一模)英語試卷(含答案詳解)
- 教科版六年級下冊科學(xué)第三單元《宇宙》教材分析及全部教案(定稿;共7課時(shí))
- 2024年中國鐵路投資集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 干部人事檔案數(shù)字化 制度
- 經(jīng)營開發(fā)部工作目標(biāo)責(zé)任書
評論
0/150
提交評論