強制型別轉化(陣列名以及陣列名取地址)
阿新 • • 發佈:2019-02-13
程式碼:
void main()
{
int a[4] = {1,2,3,4};
int *ptr0 = &a[0] + 1;
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
int *ptr3 = (int *)(a + 1);
cout<<*ptr0<<" "<<ptr1[-1]<<" "<<*ptr2<<" "<<*ptr3<<" "<<endl;
}
解釋:
&a[0]+1---->>指標加一:取決於指標的型別,a[0]的型別為int即整型
所以:&a[0]+1 = &a[0]+4,ptr0指向陣列的第二個元素
&a+1 ---->>指標加一:取決於指標的型別,&a是指向陣列的一個指標
大小為4*4=16個位元組,&a+1 = a+16,所以ptr1指向4的後面的一個空間
int(a)+1--->>普通加法:先把a的地址強制型別轉化為整型數再加一
(int *)((int)a + 1):把剛求出來的整型值強制轉化為地址(int *)
即指向元素a[0]的第二個位元組,因為指標是int型的,所以結果是
a[0]的後三個位元組,以及a[1]的第一個位元組
a+1 ---->>陣列名加一:陣列名(指標常量)型別:因為陣列元素是:
int型,所以a也是int型指標,a+1 = a+4,所以指向下一個元素
看下面一段程式碼:
#include<iostream> using namespace std; int a[2] = {1,2}; int main() { cout<<"a = "<<a <<endl; cout<<"&a = "<<&a <<endl; cout<<"a + 1 = "<<a+1 <<endl; cout<<"&a + 1 = "<<&a+1<<endl; }
解釋:
一般情況
<c和指標>p141:陣列名的值是一個指標常量,也就是陣列第一個元素的地址;
他的型別取決於陣列元素的型別:如果元素型別為char則,陣列名的型別就是
“指向char型的常量指標”
特殊情況
<c和指標>p142:當陣列名作為sizeof操作符和單目操作符&的運算元時,陣列名
並未當做指標常量表示,sizeof(陣列名)=陣列的長度,&陣列名=是一個指向陣列
的指標,(而不是一個指向指標常量的指標)
//&a------------->一個指向陣列的指標
//a ------------->一個指向a[0]的指標