int *ptr=(int *)(&a+1)问题的探讨

来源:互联网 发布:基因大数据 编辑:程序博客网 时间:2024/05/16 08:38
int *ptr=(int *)(&a+1)问题的探讨


#include<stdio.h>
int main(void)

int a[5] = {1, 2, 3, 4, 5}; 
int *ptr1 = (int*)(&a + 1); //&a指针指向的元素为整个数组,故加为sizeof(数组) 
int *ptr2 = (int*)((int)a + 1); //a地址再加一个字节,直接地址值相加而不是指针 
int *ptr3 = (int*)(a + 1); //a为数组首元素的地址,a+1为数组第二个元素的地址 
printf("%x %x %x\n", ptr1[-1], *ptr2, *ptr3); 
return 0;
}


1)地址  0-3  4-7  8-11 12-15 16-19  20-23
   数值   1    2    3     4     5 
   &a指针指向的元素为整个数组,故加为sizeof(数组),故&a+1 就是地址为20的地方
   *ptr1[-1]就是20-4=16这个地方,因为一个Int 占用4个地址。


2)(int*)((int)a + 1);表示:a地址再加一个字节,即地址为1,直接是地址值相加而不是指针。跟a+1不一样,而a+1的地址是4。所以*ptr2表示的是指向地址为1的指针地址。


3)(int*)(a + 1);表示:a为数组首元素的地址,a+1为数组第二个元素的地址。所以*ptr3表示的是指向地址为4的指针地址。
阅读全文
0 0
原创粉丝点击