黑马程序员技术交流社区

标题: C语言指针的问题 [打印本页]

作者: pyy061    时间: 2015-8-29 22:41
标题: C语言指针的问题
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr – 1));
这个怎么理解?
作者: huahaoL    时间: 2015-8-30 00:11
指针有点难
作者: aidan    时间: 2015-8-30 11:48
本帖最后由 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)才会有对应的值
就是输出第二个和第一个数组元素的值。
以后最好把整个代码敲过来。。不然都不好看

作者: jx836202365    时间: 2015-8-30 13:18
我来学习下,这是数组指针的内容吧,我还没看到呢
作者: pyy061    时间: 2015-8-30 14:30
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;
}
这个是全部的代码

作者: pyy061    时间: 2015-8-30 14:32
jx836202365 发表于 2015-8-30 13:18
我来学习下,这是数组指针的内容吧,我还没看到呢

表示脑子快烧坏了....
作者: pyy061    时间: 2015-8-30 14:34
huahaoL 发表于 2015-8-30 00:11
指针有点难

单独的还行,结合起来数组什么的,难的不行
作者: aidan    时间: 2015-8-30 15:37
额。。表示我也糊了。运行结果是 2 5
作者: aidan    时间: 2015-8-30 15:46
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。
作者: pyy061    时间: 2015-8-30 15:57
aidan 发表于 2015-8-30 15:46
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。

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


作者: pyy061    时间: 2015-8-30 15:58
aidan 发表于 2015-8-30 15:46
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。

&a+1是指向a[5]的?
作者: 夜空守望者    时间: 2015-8-30 16:30
aidan 发表于 2015-8-30 11:48
int *ptr = (int*)(&a + 1);
应该是把第二个数组元素值存放在ptr指向的地址中
这里的ptr之前应该有指向的地 ...

给力,分析的很好
作者: to_love    时间: 2015-8-30 16:36
aidan 发表于 2015-8-30 15:46
&a+1  加了20个字节
a+1 加4个字节
是这样。。没错。。

&a+1  加了20个字节
为什么加20
作者: aidan    时间: 2015-8-30 16:48
可以那么理解。。我在Xcode上运行算了一下。。
作者: aidan    时间: 2015-8-30 16:49
本帖最后由 aidan 于 2015-8-30 16:51 编辑

int a[5]  5个整型元素占20个字节哈  
&a+1相当于又加了一个a[5]所占空间

作者: dw4861    时间: 2015-8-31 23:36
我们来一行一行的解读

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

请参考




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2