C++中指针*和取地址&的连用解析

一个例子说明*和&之间的连用关系:

代码如下

int main(){  
    int a[5] = { 1, 2, 3, 4, 5 };  
    int *ptr = (int*)(&a + 1);  
    int *ptr1 = (int*)(&a) + 1;  
    cout << "*********1:" << endl;  
    cout << "&a[0] : " << &a[0] << endl;  
    cout << "&a[1] : " << &a[1] << endl;  
    cout << "&a[2] : " << &a[2] << endl;  
    cout << "&a[3] : " << &a[3] << endl;  
    cout << "&a[4] : " << &a[4] << endl;  
    cout << "*********2" << endl;  
    cout << "a : " << a << endl;  
    cout << "&a : " << &a << endl;  
    cout << "a + 1 : " << a + 1 << endl;  
    cout << "&a + 1 : " << &a + 1 << endl;  
    cout << "*********3" << endl;  
    cout << "ptr : " << ptr << endl;  
    cout << "ptr1 : " << ptr1 << endl;  
    cout << "*********4" << endl;  
    cout << "*(a + 1) : " << *(a + 1) << "   *(ptr - 1) :  " << *(ptr - 1) << endl;  
    cout << "*(a + 1) : " << *(a + 1) << "   *(ptr1 - 1) : " << *(ptr1 - 1) << endl;  
    getchar();  
    return 0;  
}  

这里写图片描述
解析:

  • 无论是32位机器还是64位机器,INT类型长度均为4字节,因此对于数组一个来说,一个[0]与一个[1],A [1]与一个[2]之间地址都差4字节。

  • 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量的指针;虽然与一个输出的地址和一个相同,但是:一个是一个指向数组首地址的指针,一个+ 1是指向该数组第一个数据元素的下一个数据元素,即一个存的地址是一个[0]的,那么一个+ 1存的地址就是一个[1]的;而&一个返回的是指向数组的指针,&一个+ 1指向的是这块数组之后的下一个位置,相当于一个[5]的地址;也就是说,当数组名加1时,这里的1表示位一个数组元素单元(一个INT类型的数组元素单元就是地址加4),而&数组名则是以整个数组为单元,当数组名取地址加1时,这里的1表示为整个数组单元(如例子中有五个INT类型,所以&一个1是一个与地址加5×4 = 20)

  • 将(A + 1)强转成(INT *),然后赋值给PTR,那么PTR就有了和(A + 1)相同的地址,即指向一个[5],这时已经越界,但是输出的是PTR-1,也就是指向一个[4]的指针,所以并没越界,程序也不会抛出异常另:*(PTR-1)是PTR-1这个指针指向的内存的值,输出的就是一个[4]的值。

  • 一个+ 1即A [1],等于2; PTR-1即A [4],等于5; ptr1-10]即A [1于。

猜你喜欢

转载自blog.csdn.net/osean_li/article/details/80301822