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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

1.相關概念

操作系統給每個存儲單元分配了一個編號,從ox00000000~0xffffffff,這個編號稱為地址,指針就是地址指針變量:即這個變量用來存放一個地址編號無論什么類型的地址,都是存儲單元的變換,在32位平臺下都是4個字節,即任何類型的指針變量都是4個字節大小,64位操作系統占8個字節。對應類型的指針變量,只能存放對應類型的地址。例如整型指針變量,只能存放整型變量的地址。

#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;

}

可見,我的操作系統是64位的。

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

64位系統,這個位數指的是CPU里面的通用寄存器的數據寬度為64位,也就是說一個地址占二進制位數是64,所以:

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

32位系統,同理,他的一個地址占32位二進制空間,sizeof(double*)==sizeof(int*)==sizeof(char*)==32/8==4

其實明白了兩個系統的尋址原理就能明白,大體就是這個原因。地址跟系統有關,但是基本數據類型占的大小是由C語言本身決定。

2.指針的定義方法

數據類型*指針變量名

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

關于指針的運算符:

取地址*取值

#includestdio.h

intmain()

inta=100;

int*p;//定義一個指針變量

p=//給指針變量賦值

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

return0;

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

3.指針的分類

字符指針短整型指針整型指針長整型指針float型指針double型指針函數指針結構體指針指針的指針數組的指針

4.指針和變量的關系

引用變量的方法:

1.直接通過變量的名稱

2.通過*指針名稱引用

#includestdio.h

intmain()

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

p1=

p2=

printf("請輸入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;

如果想讓不同類型的指針相互賦值的時候,需要強制類型轉換:

#includestdio.h

intmain()

inta=0x1234,b=0x5678;//4個字節

char*p1,*p2;//char類型只能保存一個字節

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

p1=(char*)//強制類型轉換

p2=(char*)

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

p1++;//指針向上移動

p2++;

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

return0;

5.指針與數組的關系

指針保存的是數組第一個元素的地址

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

#includestdio.h

intmain(){

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

int*p;

p=a;

//指針指向數組a的第一個元素的首地址

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.指針的運算

指針可以加一個整數,往下指幾個它指向的變量,結果還是地址

#includestdio.h

voidtest1()

inta[10];

int*p,*q;

p=a;

q=p+2;//pq間隔8個字節,意味著加一個整數最終移動的字節數與指針變量的類型也有關系

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

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

return;

intmain()

test1();

return0;

}

兩個相同的指針可以比較大小

前提:指向同一個數組的元素

#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;

}

兩個同類型的指針可以做減法

前提:指向同一個數組元素,減法的結果是指針指向的中間有多少個元素

#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;

}

兩個相同類型的指針可以相互賦值

#includestdio.h

voidtest4()

inta=100;

int*p,*q;

p=

printf("

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論