C語言由淺入深理解指針_第1頁
C語言由淺入深理解指針_第2頁
C語言由淺入深理解指針_第3頁
C語言由淺入深理解指針_第4頁
C語言由淺入深理解指針_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第C語言由淺入深理解指針目錄1.相關(guān)概念2.指針的定義方法3.指針的分類4.指針和變量的關(guān)系5.指針與數(shù)組的關(guān)系6.指針的運(yùn)算

1.相關(guān)概念

操作系統(tǒng)給每個(gè)存儲(chǔ)單元分配了一個(gè)編號(hào),從ox00000000~0xffffffff,這個(gè)編號(hào)稱為地址,指針就是地址指針變量:即這個(gè)變量用來存放一個(gè)地址編號(hào)無論什么類型的地址,都是存儲(chǔ)單元的變換,在32位平臺(tái)下都是4個(gè)字節(jié),即任何類型的指針變量都是4個(gè)字節(jié)大小,64位操作系統(tǒng)占8個(gè)字節(jié)。對(duì)應(yīng)類型的指針變量,只能存放對(duì)應(yīng)類型的地址。例如整型指針變量,只能存放整型變量的地址。

#includestdio.h

intmain()

char*a;

short*b;

int*c;

long*d;

float*e;

double*f;

printf("sizeof(a)=%d\n",sizeof(a));

printf("sizeof(b)=%d\n",sizeof(b));

printf("sizeof(c)=%d\n",sizeof(c));

printf("sizeof(d)=%d\n",sizeof(d));

printf("sizeof(e)=%d\n",sizeof(e));

printf("sizeof(f)=%d\n",sizeof(f));

return0;

}

可見,我的操作系統(tǒng)是64位的。

為什么在64位系統(tǒng)中指針的大小是8,而32位的卻是4?

64位系統(tǒng),這個(gè)位數(shù)指的是CPU里面的通用寄存器的數(shù)據(jù)寬度為64位,也就是說一個(gè)地址占二進(jìn)制位數(shù)是64,所以:

sizeof(double*)==sizeof(int*)==sizeof(char*)==64/8==8

32位系統(tǒng),同理,他的一個(gè)地址占32位二進(jìn)制空間,sizeof(double*)==sizeof(int*)==sizeof(char*)==32/8==4

其實(shí)明白了兩個(gè)系統(tǒng)的尋址原理就能明白,大體就是這個(gè)原因。地址跟系統(tǒng)有關(guān),但是基本數(shù)據(jù)類型占的大小是由C語言本身決定。

2.指針的定義方法

數(shù)據(jù)類型*指針變量名

intp;//定義了一個(gè)指針變量p在定義指針變量的時(shí)候,是用來修飾變量的,代表指針變量。

關(guān)于指針的運(yùn)算符:

取地址*取值

#includestdio.h

intmain()

inta=100;

int*p;//定義一個(gè)指針變量

p=//給指針變量賦值

printf("a=%d,%d\n",a,*p);//*p等價(jià)于變量a

return0;

拓展:如果一行中定義多個(gè)指針變量,每個(gè)變量前面都要加*修飾

3.指針的分類

字符指針短整型指針整型指針長(zhǎng)整型指針float型指針double型指針函數(shù)指針結(jié)構(gòu)體指針指針的指針數(shù)組的指針

4.指針和變量的關(guān)系

引用變量的方法:

1.直接通過變量的名稱

2.通過*指針名稱引用

#includestdio.h

intmain()

int*p1,*p2,temp,a,b;

p1=

p2=

printf("請(qǐng)輸入a,b的值:\n");

scanf("%d%d",p1,p2);//和之前的scanf不同,這里直接用p1p2作為寫入地址。

temp=*p1;//用p1指向的變量a給temp賦值

*p1=*p2;//用p2指向的變量b給p1指向的變量a賦值

*p2=temp;//temp給p2指向的變量b賦值

printf("a=%db=%d\n",a,b);

printf("*p1=%d,*p2=%d\n",*p1,*p2);

return0;

如果想讓不同類型的指針相互賦值的時(shí)候,需要強(qiáng)制類型轉(zhuǎn)換:

#includestdio.h

intmain()

inta=0x1234,b=0x5678;//4個(gè)字節(jié)

char*p1,*p2;//char類型只能保存一個(gè)字節(jié)

printf("%#x%#x\n",a,b);

p1=(char*)//強(qiáng)制類型轉(zhuǎn)換

p2=(char*)

printf("%#x%#x\n",*p1,*p2);

p1++;//指針向上移動(dòng)

p2++;

printf("%#x%#x\n",*p1,*p2);

return0;

5.指針與數(shù)組的關(guān)系

指針保存的是數(shù)組第一個(gè)元素的地址

也可以通過*(p+2)=100給當(dāng)前地址的下一個(gè)變量賦值

#includestdio.h

intmain(){

inta[5]={0,1,2,3,4};

int*p;

p=a;

//指針指向數(shù)組a的第一個(gè)元素的首地址

printf("a[2]=%d\n",a[2]);

printf("p[2]=%d\n",p[2]);

//*(a+n)==*(p+n)==a[n]==p[n]

printf("*(p+2)%d\n",*(p+2));

printf("*(a+2)%d\n",*(a+2));

printf("p=%p\n",p);

printf("p+2=%p\n",p+2);

return0;

}

6.指針的運(yùn)算

指針可以加一個(gè)整數(shù),往下指幾個(gè)它指向的變量,結(jié)果還是地址

#includestdio.h

voidtest1()

inta[10];

int*p,*q;

p=a;

q=p+2;//pq間隔8個(gè)字節(jié),意味著加一個(gè)整數(shù)最終移動(dòng)的字節(jié)數(shù)與指針變量的類型也有關(guān)系

printf("p=%p\n",p);

printf("q=%p\n",q);

return;

intmain()

test1();

return0;

}

兩個(gè)相同的指針可以比較大小

前提:指向同一個(gè)數(shù)組的元素

#includestdio.h

voidtest2()

inta[10];

int*p,*q;

p=a[1];

q=a[6];

if(pq)

printf("pq\n");

elseif(pq)

printf("pq\n");

else

printf("p=q\n");

return;

intmain()

//test1();

test2();

return0;

}

兩個(gè)同類型的指針可以做減法

前提:指向同一個(gè)數(shù)組元素,減法的結(jié)果是指針指向的中間有多少個(gè)元素

#includestdio.h

voidtest3()

inta[10];

int*p,*q;

p=a[0];

q=a[3];

printf("%ld\n",q-p);

return;

intmain()

//test1();

//test2();

test3();

return0;

}

兩個(gè)相同類型的指針可以相互賦值

#includestdio.h

voidtest4()

inta=100;

int*p,*q;

p=

printf("

溫馨提示

  • 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)論