版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C語言指針超詳細(xì)講解下篇目錄前言指針運(yùn)算指針整數(shù)指針-指針指針的關(guān)系運(yùn)算指針和數(shù)組二級(jí)指針指針數(shù)組舉例1舉例2總結(jié)
前言
本文接著上一篇內(nèi)容,繼續(xù)學(xué)習(xí)指針相關(guān)知識(shí)點(diǎn)。
指針運(yùn)算
指針整數(shù)指針-指針指針的關(guān)系運(yùn)算
指針整數(shù)
#defineVALUE5
intmain()
floatvalues[VALUE];
float*vp;
//指針+-指針,關(guān)系運(yùn)算
for(vp=values[0];vpvalues[VALUE];)
*vp++=0;//通過這樣完成初始化
for(inti=0;iVALUE;i++)
printf("%d",values[i]);
return0;
指針-指針
intmain()
intarr[10]={0};
printf("%d\n",arr[9]-arr[0]);//得到元素的個(gè)數(shù)
printf("%d\n",sizeof(arr)/sizeof(arr[0]));//計(jì)算元素個(gè)數(shù)
int*p0=arr[0];
int*p9=arr[9];
printf("%d\n",(p9-p0));//得到元素的個(gè)數(shù)
return0;
通過數(shù)組首尾元素的地址相減,得出的就是數(shù)組元素的個(gè)數(shù),
-int*表示指針指向的地址里面,存放的數(shù)據(jù)類型是整形,占用4個(gè)字節(jié)
數(shù)組元素地址+1,就是尋找下一個(gè)元素的地址,就會(huì)移動(dòng)4個(gè)字節(jié)
通過調(diào)試更加清楚的觀察到這一現(xiàn)象,int數(shù)組每個(gè)元素占用四個(gè)字節(jié):
arr[0]:0x005cf7f8arr[0]+1:0x005cf7fc,地址移動(dòng)1位,即int*指針移動(dòng)1位,字節(jié)增加4個(gè)。
前提條件:兩個(gè)指針必須指向同一塊空間:
charch[5];
intarr[6];
%arr[4]-ch[3];//錯(cuò)誤的
前面的文章介紹了字符串長度的方法兩種方法:
這里介紹第三種方法,指針
intmylen(char*pa)//傳參是數(shù)組首元素的地址
char*p=pa;//首元素地址
while(*pa)//元素不是‘0'
pa++;//通過地址訪問字符串
//結(jié)尾字符0的地址減首元素地址
returnpa-p;//指針相減是元素的個(gè)數(shù)
intmain()
chararr[]="abcdef";
intlen=mylen(arr);
printf("%d",len);
return0;
指針的關(guān)系運(yùn)算
標(biāo)準(zhǔn)規(guī)定:允許指向數(shù)組元素的指針與指向數(shù)組最后一個(gè)元素后面的那個(gè)內(nèi)存位置的指針比較,但是不允許與
指向第一個(gè)元素之前的那個(gè)內(nèi)存位置的指針進(jìn)行比較
intmain()
for(vp=values[5];vpvalues[0];)
*--vp=0;
for(vp=values[5-1];vp=values[0];vp--)//不允許
//地址會(huì)指向首元素前面的地址,這是不允許的
*vp=0;
return0;
指針和數(shù)組
intmain()
intarr[10]={1,2,3,4,5,6,7,8,9,0};
printf("%p\n",arr);
printf("%p\n",arr[0]);
int*p=arr;//p存放的是數(shù)組首元素的地址
return0;
數(shù)組名和數(shù)組首元素的地址是一樣的。數(shù)組名表示的是數(shù)組首元素的地址。(2種情況除外,數(shù)組系列文章詳細(xì)介紹了)
既然可以把數(shù)組名當(dāng)成地址存放到一個(gè)指針中,我們使用指針來訪問一個(gè)就成為可能
intmain()
intarr[]={1,2,3,4,5,6,7,8,9,0};
int*p=arr;//指針存放數(shù)組首元素的地址
intsz=sizeof(arr)/sizeof(arr[0]);
for(inti=0;ii++)
printf("arr[%d]=%p====p+%d=%p\n",i,arr[i],i,p+i);
return0;
觀察上圖,所以p+i其實(shí)計(jì)算的是數(shù)組arr下標(biāo)為i元素的地址。那就可以直接通過指針來訪問數(shù)組:
intmain()
intarr[10]={1,2,3,4,5,6,7,8,9,10};
int*p=arr;
intsz=sizeof(arr)/sizeof(arr[0]);
for(inti=0;ii++)
printf("%d",*(p+i));
printf("\n");
for(inti=0;ii++)
printf("%d",*(p++));
printf("\n");
for(inti=0;ii++)
printf("%d",arr[i]);
return0;
二級(jí)指針
指針變量也是變量,是變量就有地址,那指針變量的地址存放在哪里?這就是二級(jí)指針
intmain()
inta=10;
int*pa=
int**ppa=
return0;
a的地址存放在指針pa中,pa是一級(jí)指針pa的地址存放在ppa中,ppa是二級(jí)指針
對(duì)于二級(jí)指針的運(yùn)算有:
*ppa通過對(duì)ppa中的地址進(jìn)行解引用,這樣找到的是pa,*ppa其實(shí)訪問的就是pa.
intb=20;
*ppa=//等價(jià)于pa=
**ppa先通過*ppa找到pa,然后對(duì)pa進(jìn)行解引用操作:*pa,那找到的是a
**ppa=30;
//等價(jià)于*pa=30;
//等價(jià)于a=30;
指針數(shù)組
指針數(shù)組是指針還是數(shù)組?
是數(shù)組。是存放指針的數(shù)組
在數(shù)組系列文章中,已經(jīng)介紹了整形數(shù)組,字符數(shù)組:
intarr1[5];//占用20個(gè)字節(jié)
chararr2[5];//占用5個(gè)字節(jié)
舉例1
指針數(shù)組:
intmain()
intdata1[]={1,2,3,4,5};
intdata2[]={2,3,4,5,6};
intdata3[]={3,4,5,6,7};
//看成二維數(shù)組
int*arr[3]={data1,data2,data3};
for(inti=0;ii++)
for(intj=0;jj++)
{//[]是操作符
printf("%d",arr[i][j]);//不需要解引用
printf("\n");
return0;
arr3是一個(gè)數(shù)組,有五個(gè)元素,每個(gè)元素是一個(gè)整形指針,就是一個(gè)地址:
arr[0],為元素data1,是指針變量,本身也是一維數(shù)組{1,2,3,4,5}的數(shù)組名,代表首元素地址arr[1],為元素data2,是指針變量,本身也是一維數(shù)組{2,3,4,5,6}的數(shù)組名,代表首元素地址arr[2],為元素data3,是指針變量,本身也是一維數(shù)組{3,4,5,6,7}的數(shù)組名,代表首元素地址
通過調(diào)試也能發(fā)現(xiàn):
指針數(shù)組首元素data,是指針變量,也是一維數(shù)組首元素的地址通過數(shù)組名+i就能訪問數(shù)組里的元素指針數(shù)組可看成二維數(shù)組
arr[0]=data1;//指針數(shù)組首元素data,是指針變量,也是一維數(shù)組首元素的地址
arr[0][0]=data1[0];//看成一維數(shù)組
arr[0][1]=data1[1];
arr[0][2]=data1[2];
arr[0][3]=data1[3];
arr[0][4]=data1[4];
打印結(jié)果見下圖:
代碼換成下面這個(gè)效果一樣,從地址的解引用角度去寫:
intmain()
intdata1[]={1,2,3,4,5};
intdata2[]={2,3,4,5,6};
intdata3[]={3,4,5,6,7};
//看成二維數(shù)組
int*arr[3]={data1,data2,data3};
for(inti=0;ii++)
for(intj=0;jj++)
printf("%d",*(arr[i]+j));//地址訪問解引用
printf("\n");
return0;
舉例2
指針數(shù)組中元素都是指針變量,就是地址
intmain()
inta=10;
intb=11;
intc=12;
intd=13;
inte=14;
int*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 46940-2025中醫(yī)藥中醫(yī)臨床術(shù)語系統(tǒng)分類框架
- 海外領(lǐng)事保護(hù)培訓(xùn)課件
- 電子數(shù)據(jù)取證分析師崗前操作規(guī)范考核試卷含答案
- 布藝工操作能力競賽考核試卷含答案
- 船舶機(jī)工崗前個(gè)人技能考核試卷含答案
- 潤滑油調(diào)合操作工崗前情緒管理考核試卷含答案
- 漁網(wǎng)具工測試驗(yàn)證測試考核試卷含答案
- 動(dòng)物膠提膠濃縮工創(chuàng)新思維強(qiáng)化考核試卷含答案
- 酒店員工職業(yè)發(fā)展與晉升通道制度
- 浪費(fèi)培訓(xùn)教學(xué)課件
- 《水庫泥沙淤積及影響評(píng)估技術(shù)規(guī)范》
- 2023-2024學(xué)年浙江省杭州市西湖區(qū)教科版五年級(jí)上冊期末考試科學(xué)試卷
- GB/T 7948-2024滑動(dòng)軸承塑料軸套極限PV試驗(yàn)方法
- DL∕T 1057-2023 自動(dòng)跟蹤補(bǔ)償消弧線圈成套裝置技術(shù)條件
- AQ 2003-2018 軋鋼安全規(guī)程(正式版)
- 兒童特發(fā)性矮身材診斷與治療中國專家共識(shí)(2023版)解讀
- 村委會(huì)指定監(jiān)護(hù)人證明書模板
- 送給業(yè)主禮物方案
- JJG 393-2018便攜式X、γ輻射周圍劑量當(dāng)量(率)儀和監(jiān)測儀
- 辦理退休委托書
- 數(shù)據(jù)分析部年終述職報(bào)告總結(jié)
評(píng)論
0/150
提交評(píng)論