指標和陣列

sunmenggmail發表於2012-05-04

首先明確一點,指標之間的加減不是簡單的加減,而是隻的是指標所指向元素個數的加減,也就是說是元素個數的偏移


int *p11 = (int *)0xfff4;
int *p12 = (int *)0xfff0;
cout<<p11-p12<<endl;


輸出應該是4/4 =1


1. 一維陣列

int a[5];
cout<<sizeof(a)<<" "<<sizeof(&a)<<" "<<sizeof(&a[0])<<endl;

//output:20 4 4

//a是一個陣列,所以a的長度5*sizeof(int);&a表示陣列的指標,指標的長度都是4


cout<<a<<" "<<&a<<" "<<&a[0]<<endl;

//output:0027FBAC  0027FBAC  0027FBAC

//陣列和指標不同之處在於,編譯器並沒有為陣列a分配一個空間儲存其地址,所以a就表示這個陣列的地址;&a表示是陣列的指標,而這個陣列是5個元素的陣列,&a表示一個指向五元陣列的指標

cout<<a+1<<" "<<&a +1 <<" "<<&a[0]+1<<endl;

//output:0027FBB0  0027FBC0  0027FBB0

//a在數值上是陣列的首地址,a+1就是第二個元素的地址,0027FBAC+4 = 0027FBB0  ;a不是int *p,但是為了幫助理解可以把a看做int *p,則a+1就是其所指元素的偏移1,

//&a可以看成是int (*)[5],所以&a+1,就是&a所指向元素的偏移1,而&a所指向的元素是一個5元的陣列,所以&a+1 = 0x0027FBAC+5*4 =0x0027FBAC+0x14  = 0x 0027FBC0  


2 .二維陣列

在記憶體中二維陣列也是一維陣列的排列方式

int a[3][4]

但是編譯器是這樣理解的:

a是一個3個元素的陣列,而元素裡存的是4元陣列的地址

a+1表示第二個元素,此時a+1還是指向“4元陣列”的指標,*(a+1)變為指向int的指標,但是a+1和*(a+1)的值相同,譬如都是002BF7E4

所以a[1][2]的地址可以有以下幾種表示方式:

out<<&a[1][2]<<" "<<&a[0][0] +1*4+2<<" "<< (*(a+1)+2)<<endl;


還有一個比較繞的程式(紅色字型表示可以替代):

int calendar[12][31];
int (*month)[31];
for (month = calendar;month<calendar+12/*&calendar[12]*/;++month)
{
int *day;
for (day = *month;day<*month +31/*&(*month)[31]*/;++day)//在這裡就可以深刻理解到本來month就是一個指向31個int陣列的指標,month的元素就是陣列,month偏移的單位也是這個陣列大小,*month就是表示31個int的陣列,此時*month表示指向int 的指標
{
*day  = 0;
}
}






相關文章