A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pyy061 中级黑马   /  2015-8-29 22:41  /  1241 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr – 1));
这个怎么理解?

15 个回复

倒序浏览
指针有点难
回复 使用道具 举报
本帖最后由 aidan 于 2015-8-30 11:49 编辑

int *ptr = (int*)(&a + 1);
应该是把第二个数组元素值存放在ptr指向的地址中
这里的ptr之前应该有指向的地址吧
printf("%d %d\n", *(a + 1), *(ptr – 1));
看到这里 。。ptr之前应该是指向的数组a的首地址,然后这里*(ptr-1)才会有对应的值
就是输出第二个和第一个数组元素的值。
以后最好把整个代码敲过来。。不然都不好看
回复 使用道具 举报
我来学习下,这是数组指针的内容吧,我还没看到呢
回复 使用道具 举报
aidan 发表于 2015-8-30 11:48
int *ptr = (int*)(&a + 1);
应该是把第二个数组元素值存放在ptr指向的地址中
这里的ptr之前应该有指向的地 ...

#include<stdio.h>
   int main(){
   int a[5] = { 1, 2, 3, 4, 5 };

   int *ptr = (int*)(&a + 1);

   printf("%d %d\n", *(a + 1), *(ptr-1));

    return 0;
}
这个是全部的代码
回复 使用道具 举报
jx836202365 发表于 2015-8-30 13:18
我来学习下,这是数组指针的内容吧,我还没看到呢

表示脑子快烧坏了....
回复 使用道具 举报
pyy061 中级黑马 2015-8-30 14:34:13
7#

单独的还行,结合起来数组什么的,难的不行
回复 使用道具 举报
aidan 中级黑马 2015-8-30 15:37:14
8#
额。。表示我也糊了。运行结果是 2 5
回复 使用道具 举报
aidan 中级黑马 2015-8-30 15:46:35
9#
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。
回复 使用道具 举报
aidan 发表于 2015-8-30 15:46
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。

还是不懂...用字节来理解吗

回复 使用道具 举报
aidan 发表于 2015-8-30 15:46
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。

&a+1是指向a[5]的?
回复 使用道具 举报
aidan 发表于 2015-8-30 11:48
int *ptr = (int*)(&a + 1);
应该是把第二个数组元素值存放在ptr指向的地址中
这里的ptr之前应该有指向的地 ...

给力,分析的很好
回复 使用道具 举报
aidan 发表于 2015-8-30 15:46
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。

&a+1  加了20个字节
为什么加20
回复 使用道具 举报
aidan 中级黑马 2015-8-30 16:48:31
14#
可以那么理解。。我在Xcode上运行算了一下。。
回复 使用道具 举报
aidan 中级黑马 2015-8-30 16:49:36
15#
本帖最后由 aidan 于 2015-8-30 16:51 编辑

int a[5]  5个整型元素占20个字节哈  
&a+1相当于又加了一个a[5]所占空间
回复 使用道具 举报
我们来一行一行的解读

int a[5] = { 1, 2, 3, 4, 5 }; //定义一个含5个int类型的元素的数组。

int *ptr = (int*)(&a + 1);
上面这句拆开来
&a + 1 :&是取地址的标识符,即取a数组的首地址并向后偏移1位,即a数组的第2个元素。
(int*)(&a + 1):int*用于定义指针,即一个指针指向a数组的第2个元素。
*ptr = (int*)(&a + 1):定义一个指针ptr,指向a数组的第2个元素。

printf("%d %d\n", *(a + 1), *(ptr – 1));
*(a + 1):a即首地址,相当于一个指针,(a + 1)相当于一个指针向后偏移1位,即a数组的第2个元素,*(a + 1)就是获取a数组的第2个元素的值。
*(ptr – 1):ptr是一个指针,指向指向a数组的第2个元素,(ptr – 1)即指针向前偏移一位,即指向a数组的第1个元素,*(ptr – 1)就是获取a数组的第1个元素的值
printf("%d %d\n", *(a + 1), *(ptr – 1)):结果会依次打印出整型的 a数组的第2个元素的值和a数组的第1个元素的值,即 2 1

请参考
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马