




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——C語言中各種類型指針的特性與用法介紹C語言中各種類型指針的特性與用法介紹
本文主要介紹了C語言中各種類型指針的特性與用法,有需要的摯友可以參考一下!想了解更多相關(guān)信息請持續(xù)關(guān)注我們我!
指針為什么要區(qū)分類型:
在同一種編譯器環(huán)境下,一個指針變量所占用的內(nèi)存空間是固定的。譬如,在16位編譯器環(huán)境下,任何一個指針變量都只占用8個字節(jié),并不會隨所指向變量的類型而變更。
雖然全體的指針都只占8個字節(jié),但不同類型的變量卻占不同的字節(jié)數(shù)。
一個int占用4個字節(jié),一個char占用1個字節(jié),而一個double占用8字節(jié);
現(xiàn)在只有一個地址,我怎么才能知道要從這個地址開頭向后訪問多少個字節(jié)的存儲空間呢,是4個,是1個,還是8個。
所以指針變量需要它所指向的數(shù)據(jù)類型報告它要訪問多少個字節(jié)存儲空間。
也就是說,假設(shè)不指定指針的類型,那么當指針指向一個變量的時候,她從首地址開頭,但是它不知道什么時候中斷,它不知道要訪問多少個存儲空間。譬如有一個char類型的變量,我用一個指針指向它,但是這個指針我設(shè)置成int類型,這樣一來這個指針就會向后訪問四個字節(jié)的存儲空間,很明顯得到的結(jié)果不是char類型理應(yīng)得到的,所以要區(qū)分類型。
只有指針是可以運算(移動)的`,數(shù)組名是不成以的。
intx[10];
x++;//illegal
int*p=x;
p++;//legal
兩指針變量相減所得之差是兩個指針所指數(shù)組元素之間相差的元素個數(shù)。
實際上是兩個指針值地址相減之差再除以該數(shù)組元素的長度字節(jié)數(shù)。
pointer2地址值-pointer地址值/sizeof所指向數(shù)據(jù)類型
指針之間可以相減,但不成以相加相加無意義。
定義字符串:
字符數(shù)組:
charstring[]=hello;
printf%s,string;
字符串指針指向字符串:
char*str=hello
使用字符數(shù)組來保存的字符串是存在”?!崩锏模运强勺x可寫的,所以我們可以修改字符數(shù)組里的某個元素的值。
但是,使用字符指針來保存字符串,它保存的是字符串常量地址,常量區(qū)是只讀的,所以是不成改的。
char*str=hello;
*str+1=w;//錯誤
使用留神:
char*str;
scanf%s,str;
/*str是一個野指針,他并沒有指向某一塊內(nèi)存空間,所以不允許這樣寫。假設(shè)給str調(diào)配內(nèi)存空間是可以這樣用的*/
/*********數(shù)組的方法****************/
charname[20];
scanf%s,name;
/*************給字符針針調(diào)配內(nèi)存空間的手段***********/
char*name;
name=char*malloc50;//此時name已經(jīng)指向一個剛剛調(diào)配的地址空間。
scanf%s,name;
?
指針函數(shù)(是函數(shù),返回值是指針)留神:
假設(shè)函數(shù)返回一個字符串,那么假設(shè)用一個數(shù)組以下面的形式來接的話,是會報錯的:
char*test
returnhello;
intmainintargc,constchar*argv[]
charnames[10];
names=test;
return0;
這是由于,返回的字符串相當于一個這樣的數(shù)組:‘h,‘e,‘l,‘l,‘o,‘\0,但是前面我們說過,數(shù)組假設(shè)在定義的時候沒有用這種方式初始化,那么后面就不能再用這種方式初始化了,所以會出錯。
解決方法:將charnames[10]改為char*names或者charnames[10]直接等于test。
?
函數(shù)指針(是指針,指向函數(shù)):
格式:函數(shù)的返回值類型*指針變量名形參1,形參2,...;
intsuminta,intb
returna+b;
int*pint,int;
p=sum;
應(yīng)用場景:
調(diào)用函數(shù)
將函數(shù)作為參數(shù)在函數(shù)間傳遞
函數(shù)指針能更生動:
intminusinta,intb
returna-b;
intaddinta,intb
returna+b;
intmyFunctioninta,intb,int*funcPint,int
returnfuncPa,b;
intmain
intminusResult=myFunction10,20,minus;
intaddResult=myFunction10,20,add;
...
return0;
/*
函數(shù)指針能讓程序更生動,譬如后續(xù)有乘、除函數(shù)的時候,只需實現(xiàn)這兩個函數(shù)然后在主函數(shù)調(diào)用myFunction函數(shù)即可。假設(shè)是多人協(xié)作,不同的人寫不同的功能,假設(shè)我們來寫myFunction那么根本就不用修改就可以一向使用,分外生動。
*/
?
技巧:
1、把要指向函數(shù)頭拷貝過來
2、把函數(shù)名稱使用小括號括起來
3、在函數(shù)名稱前面加上一個*
4、修改函數(shù)名稱
使用留神:
由于這類指針變量存儲的是一個函數(shù)的入口地址,所以對它們作加減運算譬如p++是無意義的。
如上例,假設(shè)想使用p這個函數(shù)指針,可以直接向使用sum一樣:
intresult=p10,10;
也可以這樣:
intresult=*p10,10;
?
布局體是一種自定義數(shù)據(jù)類型,留神,它是數(shù)據(jù)類型。
structStudent
char*name;
intage;
;
structStudentstu;
留神,布局體的后面是有;的。
在使用布局體類型的時候,要加上struct關(guān)鍵字。
定義布局體類型的同時定義變量:
structStudent
char*name;
intage;
stu;
這種在定義的同時也定義了變量,就相當于:
structStudent
char*name;
intage;
;
structStudentstu;
定義布局體類型的同時定義變量,以后假設(shè)想持續(xù)使用這個布局體類型,依舊可以使用常規(guī)的方式定義:
structStu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨時租用商鋪合同范例
- 2025年中國絲印傘市場調(diào)查研究報告
- 公司銷售人員合同范例
- 書經(jīng)銷合同范例
- 刑事會見合同范例
- 農(nóng)場經(jīng)營代養(yǎng)合同范例
- 倉庫閣樓轉(zhuǎn)讓合同范例
- 個人資產(chǎn)質(zhì)押合同范例
- 養(yǎng)牛股合同范例
- 會展買賣合同范例
- 2019版外研社高中英語必選擇性必修一單詞表
- 常用電工儀器儀表使用方法
- 海南大學本科教育學分制條例
- 建設(shè)工程綠色施工圍蔽指導(dǎo)圖集
- 2022新教科版六年級科學下冊全一冊全部教案(共28節(jié))
- 單元綜合訓(xùn)練
- 中級Java軟件開發(fā)工程師筆試題(附答案)
- 高一物理必修一加速度(課堂PPT)
- 難免壓瘡申報表
- 端蓋壓鑄模具設(shè)計畢業(yè)設(shè)計論文
- 最新部編版一年級語文下冊第一單元教材分析
評論
0/150
提交評論