C語言指針超詳細(xì)講解下篇_第1頁
C語言指針超詳細(xì)講解下篇_第2頁
C語言指針超詳細(xì)講解下篇_第3頁
C語言指針超詳細(xì)講解下篇_第4頁
C語言指針超詳細(xì)講解下篇_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論