| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 468 人关注过本帖
标题:这个指针数组完全不懂啊。
只看楼主 加入收藏
dfahdfh
Rank: 2
等 级:论坛游民
帖 子:3
专家分:10
注 册:2014-2-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
这个指针数组完全不懂啊。
#include <stdio.h>

int main()
{   
    int a[5]={1,2,3,4,5};  
    int *i = a;
    int *ptr=(int *)(&i);
    int *p = (int *)(&a);   
  printf("%d,%d",*ptr,*p);
}
执行输出居然是:*ptr=乱码,*p=1。。。不是应该都等于1么
搜索更多相关主题的帖子: include 
2014-03-02 11:48
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
程序代码:
int main()
{
    int a[5]={1,2,3,4,5}; 
    printf("数组a的首地址是%8X\n",a);
    printf("数组a的首地址是%8X\n",&a[0]);
    int *i = a;
    printf("指针i的地址是%8X\n",&i);
    printf("指针i的值是%8X\n",i);
    printf("指针i指向的具体数值是%8X\n",*i);
    int *ptr=(int *)(&i);
    printf("指针ptr的地址是%8X\n",&ptr);
    printf("指针ptr的值是%8X\n",ptr);
    printf("指针ptr指向的具体数值是%8X\n",*ptr);
    int *p = (int *)(&a);  
    printf("指针p的地址是%8X\n",&p);
    printf("指针p的值是%8X\n",p);
    printf("指针p指向的具体数值是%8X\n",*p);
    printf("%X,%X\n",*ptr,*p);
    return 0;
}
我也不知道我写的对不对  指针这块  我也挺弱的

DO IT YOURSELF !
2014-03-02 12:35
朱鹏程
Rank: 2
等 级:论坛游民
帖 子:6
专家分:15
注 册:2014-2-13
收藏
得分:5 
i 是指针 不能用取地址符 前面的(int *)是强制转换的意思  并没有达到你想要的结果
2014-03-02 13:31
朱鹏程
Rank: 2
等 级:论坛游民
帖 子:6
专家分:15
注 册:2014-2-13
收藏
得分:0 
你写的程序的  (int *)(&a)  意思是 首先a指针的地址取出来  然后把那块地址强制转换成 整型指针    当然 会出错了     你可以  写成 (int *)a  or   int *&a;
2014-03-02 13:36
dfahdfh
Rank: 2
等 级:论坛游民
帖 子:3
专家分:10
注 册:2014-2-24
收藏
得分:0 
恩,我了解了,关键是对于静态数组来说a和&a数值是一样的
2014-03-02 15:12
hyddpjh
Rank: 2
等 级:论坛游民
帖 子:9
专家分:14
注 册:2014-2-27
收藏
得分:5 
//a就是数组的首地址,int * i =a;表示定义一个整型指针变量,i存放数组的首地址,这样i[0] = a[0](i是存放地址的,* i是内存中这个地址的内容)。i[1]就是指针指到了数组的第二个的内容, 因为数组的空间是连续的。
//指针变量 i, p,ptr.在内存中的地址是由系统分配的,*p = p[0]=a[0]存的是数组的首地址的内容,只有一个哦,要全部输出数组,就只能用循环了,p[0],p[1],..这样依次输出。
//地址其实是内存中的编号(一般机子内存地址大小就占4个字节,因为有32根地址总线,4g),用指针一指向这个地址就获得了这里面的内容。

/*至于*,&的作用,你看明白
        int k = 5;
    int *p = &k;
    int **q = &p;
    printf("%d ", **q);
*/
//希望我说明白了,能帮到你。我也是初学者,理解是个痛苦的过程,明白了就感觉简单了。
# include <stdio.h>

int main(void)
{
    int k;
    int a[5] = {0,1,2,3,4};
    int * i = a;
    int * p = i;
    int * ptr = a;
   
    for (k=0; k<5; k++)
    printf("%d ", p[k]);
    printf("\n");

    for (k=0; k<5; k++)
    printf("%d ", ptr[k]);
    printf("\n");

    return 0;
}

[ 本帖最后由 hyddpjh 于 2014-3-3 15:09 编辑 ]
2014-03-03 14:32
klapset
Rank: 4
等 级:业余侠客
威 望:2
帖 子:71
专家分:234
注 册:2014-2-27
收藏
得分:5 
额。。。
i是存放着 数组a的首地址的指针。。。对吧?
&i是这个指针变量的地址。。。对吧?
那么ptr这个指针 存放的是 上面这个指针变量所在的内存地址。。。对吧?
那么*ptr的值就是 i这个指针存放的内容。。。明白了么?
所以输出是地址值,不是乱码。

ps:  一定要区分出 指针变量 存放的内容和 它自己本身的所在内存中的地址值。

[ 本帖最后由 klapset 于 2014-3-3 17:19 编辑 ]
2014-03-03 17:17
快速回复:这个指针数组完全不懂啊。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020114 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved