黑马程序员技术交流社区
标题:
C指针问题
[打印本页]
作者:
allen405
时间:
2014-4-27 00:41
标题:
C指针问题
本帖最后由 allen405 于 2014-4-27 22:53 编辑
int main(void)
{
int a[5] = {1, 2, 3, 4, 5};
int *p = (int *)(&a + 1);
printf("%d %d\n", *(a + 1), *(p - 1));
return 0;
}
求详细解析
作者:
执着的土豆
时间:
2014-4-27 01:29
int *p = (int *)(&a + 1); 后面括号中,指针指向的位置已经越界,指针指向的是数组a第5个元素后面的一个内存位置。将这个地址赋给指针p。
printf("%d %d\n", *(a + 1), *(p - 1)); 前面括号中的a,取出的是数组的首元素的地址,既a[0]的位置,位置加1,也就是指向数组的第二个元素,既a[1],结果为2。
&a取出的是int类型的5个成员的数组首元素的指针,内存中占据的存储空间为20,加1,就是在后面再加这样一个存储空间[指针跨度为20(理论上)]。让指针p指向后面加的这个指针的首元素。
*(a+1)这里的a,是取出的a[0]的存储位置(为4个字节),加1,就是指针指向下一个4个字节的位置。指针跨度为[4个字节(因为int类型在内存中占据4个字节)]
看明白上面,你就知道*(p - 1),他的值为什么是5了吧。
不明白请追问。 实在是不能画动态图,不然给你画个gif格式的图片,你看一眼就懂了。
作者:
Er01c
时间:
2014-4-27 01:53
int main(int argc, const char * argv[])
{
/*
int a[5] = {1, 2, 3, 4, 5};
printf("%lu\n", sizeof(&a)); // a是指针常量,&a 取指向int *类型的指针的地址 即指向指针的指针
// 无论指针指向什么类型的地址,指针占8字节
printf(" &a地址:%#x\n &a+1地址:%#x\n", &a, &a + 1);
// &a 和 (&a + 1) 内存地址相差 20 5 * sizeof(int)
int *p = (int *)(&a + 1); // 将指向指针的指针强制转化为指向int类型变量的指针
printf("%i %i \n", *(a + 1), *(p + 1));
return 0;
*/
int a[5] = {1, 2, 3, 4, 5};
int *p = a + 1; // p指针变量,指向a[1]
printf("a[1] = %i\np[1] = %i\n", a[1], p[1]);
return 0;
/*
a[1] = 2
p[1] = 3
*/
}
复制代码
作者:
执着的土豆
时间:
2014-4-27 02:06
2楼的哥们,不大厚道哟。 你这写完回复,看了我得回复,再改成这样。得,也苦了你了。楼主能看明白就好。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2