1. 程式人生 > >強制型別轉化(陣列名以及陣列名取地址)

強制型別轉化(陣列名以及陣列名取地址)

程式碼:

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]的指標