| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1137 人关注过本帖
标题:数组指针指向问题! 求解惑!
只看楼主 加入收藏
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
结帖率:90%
收藏
已结贴  问题点数:10 回复次数:22 
数组指针指向问题! 求解惑!
main()
{
    int * p,i,a[10];
    p = a;
    for(i = 0;i < 10;i++)
        scanf(" %d",p++);
    printf("\n");
    for(i = 0;i < 10;i++) // for(i = 0;i < 10;i++,p++)这是原来的。如果这样 p 指向的是啊a[10]。而a[10]值及a[10]后面是不确定的,是垃圾值。
        printf(" %d",* p); //现在把 p++ 去掉了,无论输入那十个数字,* p 输出的都是0 1 2 3 4 5 6 7 8 9. 好像  p 指向了 i .
                           // 我在这行加了 printf(" %d",a[i]); 上面 scanf() 输入的数字 a[0] 到 a[9] 又都在没有被替代掉。会原样输出。
 /*
    我的疑问是 :   指针 p 被赋了 a 数组的地址。并没有和 i 有什么联系,把 for(i = 0;i < 10;i++,p++)语句中的 p++ 取掉后,p 指向的地     
址没有移动了。那么 p 指针指向的地址应该是一个固定的位置了。那么 * p 还把 0 1 2 3 4 5 6 7 8 9.输出了。我想应该就是 i 的值。那么指针变
量 p 和变量 i 是什么关系呢。它们是怎么联系在一起的? 请高人指教!!!
 */                           

}
搜索更多相关主题的帖子: 有限公司 副作用 
2015-10-30 13:09
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:1 
因为你的指针在上次scanf后停在越界位置,把i和a[10]位置对调就看的到不同,如下:
main()
{
    int * p,a[10],i;
    p = a;
    for(i = 0;i < 10;i++)
        scanf(" %d",p++);
    printf("\n");
    for(i = 0;i < 10;i++) // for(i = 0;i < 10;i++,p++)这是原来的。如果这样 p 指向的是啊a[10]。而a[10]值及a[10]后面是不确定的,是垃圾值。
        printf(" %d",* p); //现在把 p++ 去掉了,无论输入那十个数字,* p 输出的都是0 1 2 3 4 5 6 7 8 9. 好像  p 指向了 i .
                           // 我在这行加了 printf(" %d",a[i]); 上面 scanf() 输入的数字 a[0] 到 a[9] 又都在没有被替代掉。会原样输出。
/*
    我的疑问是 :   指针 p 被赋了 a 数组的地址。并没有和 i 有什么联系,把 for(i = 0;i < 10;i++,p++)语句中的 p++ 取掉后,p 指向的地     
址没有移动了。那么 p 指针指向的地址应该是一个固定的位置了。那么 * p 还把 0 1 2 3 4 5 6 7 8 9.输出了。我想应该就是 i 的值。那么指针变
量 p 和变量 i 是什么关系呢。它们是怎么联系在一起的? 请高人指教!!!
*/                           

}

能编个毛线衣吗?
2015-10-30 13:28
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 2楼 wmf2014
指针 p 停在了a[10]的位置。
     for(i = 0;i < 10;i++) // i 把自加的值给了a[10]。
            printf("%d",* p); //而指针 p 经过循环停在了a[10], 随着 i 的自加,i 又把自身的值给了a[10],而指针 p 指向a[10]所以不停的输出 i 的值。也就是0 1 2 3 4 5 6 7 8 9.是这个意思吗?
/*
   可是,即是 p 指针停在了a[10]的位置。会把a[10]内存单元的内容输出。可变量 i 为什么会把值赋给a[10]呢?程序里没有这样的赋值啊。
   如果问的有什么不对或不好的地方敬请谅解!真诚的希望你指导!
*/
2015-10-30 13:42
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
楼主1楼的代码

main()
{
    int * p,i,a[10];
    p = a;
   
    /*******增加几行代码*********/
    printf(" before scanf\n");
    printf(" p     address:0x%p\n", p);
    printf(" i     address:0x%p\n", &i);
    printf(" a[10] address:0x%p\n", &a[10]);
    /***************************/

    for(i = 0;i < 10;i++)
        scanf(" %d",p++);
    printf("\n");

    /*******增加几行代码*********/
    printf(" after scanf\n");
    printf(" p     address:0x%p\n", p);
    printf(" i     address:0x%p\n", &i);
    printf(" a[10] address:0x%p\n", &a[10]);
    /***************************/

    for(i = 0;i < 10;i++)
        printf(" %d",* p);

}

[此贴子已经被作者于2015-10-30 14:05编辑过]


总有那身价贱的人给作业贴回复完整的代码
2015-10-30 14:03
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 4楼 embed_xuel
非常感谢embed_xuel.
你让我看到了新鲜的东西。并帮我解除了我的问题。
十分抱歉!同时我又产生了新的疑问?
下面是按你给我添加的代码运行的结果:

before scanf:
p     address:0x0012FF50 //刚开始 p 与 i 和a[10]的地址是不同的。
i     address:0x0012FF78
a[10] address:0x0012FF78
9 8 7 6 5 4 3 2 1 0  //是我输入的值

after scanf:
p     address:0x0012FF78 //它们的地址经过运行后相同了。
i     address:0x0012FF78
a[10] address:0x0012FF78
 0 1 2 3 4 5 6 7 8 9 //* p 输出的值,即 i 的值。

有两新疑问:
    第一 :int * p,i,a[10];  // 定义变量和数组
           在程序开始时系统给变量 i 和数组 a[10] 分配的内存地址是相同的。而指针变量  p 分配的内存则不同。这是为什么?
           是设计这语言的人就这设计的呢(即硬性规定,要死记的),还是系统运行时依某些依据分配的?或随机分配的?
    第二 :如果 int * p,i,a[10];后面再定义几个变量如:int * p,i,a[10],a,b,c,d;
           那么变量 a,b,c,d 程序在开始分配变量内存时是否也是分配(i 和a[10])相同的地址呢?
   
2015-10-30 14:52
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
又问傻问题了。
疑问二我可以自己加上运行就可以知道地址是否相同了,抱歉了。
2015-10-30 14:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
你回頭看我上次回答你的帖子,注釋中提到兩次“創建”。

授人以渔,不授人以鱼。
2015-10-30 14:59
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:1 
回复 5楼 朔源
int a[10] 表示一个数组,数组名为a,里面有10个元素,每个元素是int型,10个元素为:
a[0];
a[1];
a[2];
a[3];
a[4];
a[5];
a[6];
a[7];
a[8];
a[9]。

注意没有a[10],a[10]是非法的,越界的。越到哪里了呢?看前面代码的运行结果。

总有那身价贱的人给作业贴回复完整的代码
2015-10-30 15:07
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 7楼 TonyDeng
你好!TonyDeng

int x;           // 在内存中創建一個變量
int* p = &x;     // 創建一個指針變量,它儲存的値是x的地址
你说的创建变量 x 和指针变量 p 将 x 变量的地址给指针变量 p 。这样它们的地址就相同了。这我理解。
   int * p,i,a[10];      后面并没有使i 和a[10]地址相等的赋值语句。
我加了变量如: int * p,i,a[10],b;变量 b 运行后 变量 b 的内存地址和其他又不同了。我想应该是 i 和a[10]之间应该是有什么联系。
因为只有它们两个变量在程序开始时分配的内存地址是相同的。而其他变量的地址则和 i 与a[10]不同 。

before scanf:
p     address:0x0012FF50
i     address:0x0012FF78
a[10] address:0x0012FF78
b     address:0x0012FF4C // b 是新加的变量它的地址和其他三个都不一样
88
9 8 7 6 5 4 3 2 1 0

after scanf:
p     address:0x0012FF78
i     address:0x0012FF78
a[10] address:0x0012FF78
b     address:0x0012FF4C // b 变量地址
 0 1 2 3 4 5 6 7 8 9


  
2015-10-30 15:20
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 8楼 embed_xuel
你好! embed_xuel
我把a[0]到a[10]的地址都运行出来。程序在开始时是按顺序隔 4个字节 分配内存的。

before scanf:
p     address:0x0012FF50 //开始 a[0]地址赋给了 p .所 p 和a[0]地址相同
a[0]  address:0x0012FF50 // 和 p 相同  
a[1]  address:0x0012FF54
a[2]  address:0x0012FF58
a[3]  address:0x0012FF5C
a[4]  address:0x0012FF60
a[5]  address:0x0012FF64
a[6]  address:0x0012FF68
a[7]  address:0x0012FF6C
a[8]  address:0x0012FF70
a[9]  address:0x0012FF74
a[10] address:0x0012FF78
i     address:0x0012FF78 //分配到 i 时为什么要分配和a[10]相同的地址。为什么不分配0x0012FF7C给 i 呢?
9 8 7 6 5 4 3 2 1 0

after scanf:
p     address:0x0012FF78 // 指针 p 运行自加后指向了a[10]所以地址和a[10]相同了。。。能理解。但 i 为什么会和a[10]相同不理解。
a[0]  address:0x0012FF50
a[1]  address:0x0012FF54
a[2]  address:0x0012FF58
a[3]  address:0x0012FF5C
a[4]  address:0x0012FF60
a[5]  address:0x0012FF64
a[6]  address:0x0012FF68
a[7]  address:0x0012FF6C
a[8]  address:0x0012FF70
a[9]  address:0x0012FF74
a[10] address:0x0012FF78
i     address:0x0012FF78
 0 1 2 3 4 5 6 7 8 9
2015-10-30 16:00
快速回复:数组指针指向问题! 求解惑!
数据加载中...
 
   



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

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