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

xiaoxiao2021-02-28  62

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

代码如下:

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; } 输出如下:

解析:

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

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

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

*****4.a+1即a[1],等于2,;ptr-1即a[4],等于5;ptr1-1即a[0],等于1。

转载请注明原文地址: https://www.6miu.com/read-46396.html

最新回复(0)