| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1137 人关注过本帖
标题:数组指针指向问题! 求解惑!
只看楼主 加入收藏
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:1 
回复 10楼 朔源
看8楼,没有a[10],好吗?

总有那身价贱的人给作业贴回复完整的代码
2015-10-30 16:04
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
回复 11楼 embed_xuel
程序定义的a[10]其实是a[0]到a[9],没有a[10]。程序分配内存也是a[0]到a[9]。a[0]地址就是指针 p 地址。接着是 i 的内存地址。
a[10]越界了。跑到 i 地址上面了。a[10]其实是没有的。没地址。流浪汉。。。。。。
有点懂了。又好像没明白。。。。。头疼。。。头疼。。。先不问了。。。洗洗睡一觉先。。。。
2015-10-30 16:17
朔源
Rank: 1
等 级:新手上路
帖 子:105
专家分:4
注 册:2015-9-22
收藏
得分:0 
谢谢给位的讲解。
2015-10-30 16:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
以下是引用朔源在2015-10-30 15:20:17的发言:

你好!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


  

x是一個變量,p也是一個變量,各自占用不同的地址,後者儲存的值是前者的地址,不是兩者的地址相同!兩個變量,由於創建它們的語句是緊鄰的,所以在棧中的地址通常也是緊鄰的。用指針訪問,當指針變量所儲存的值落入其他變量的位置,就可能破壞數據,這種動作C語言不檢查,是否允許,由程序的邏輯決定;另一種情況,訪問操作系統禁止或硬件不存在、不允許讀寫的地址,會在運行時報錯,這就是那著名的非法讀寫崩潰畫面的來源。

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


授人以渔,不授人以鱼。
2015-10-30 17:04
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
地址变量、变量地址,变量定义时如何分配...,可能已经把楼住弄晕了

能编个毛线衣吗?
2015-10-30 17:18
xxhuan_2003
Rank: 1
等 级:新手上路
威 望:1
帖 子:10
专家分:6
注 册:2015-10-27
收藏
得分:1 
   i和P没有任何直接的关系,之所以你看到打印的地址A[10](不是a[10]数组的元素了)和i的地址相同,是因为编译器在编译时刚好将I的地址分配到了那个位置,换个编译环境可能就变了,或者你将i定义为unsigned char或者char,再试试打印地址看看!!
 for(i = 0;i < 10;i++)
        scanf(" %d",p++);//这个地方会出问题,你的输入是赋值给了指针(输入的东西不知道飞到哪里了,指针也不再是指向a[0]了),而不是指向a[x]数组元素
应该是:for(i = 0;i < 10;i++,p++)
        scanf(" %d",*p);
//这时候的指针已经指超了a[10]了,后面要用的话必须恢复指针。
        p=a;//恢复指针。

或者for(i = 0;i < 10;i++)
        scanf(" %d",*(p+i));//

同样的,后面的输出也是这样的问题
2015-10-30 22:30
xxhuan_2003
Rank: 1
等 级:新手上路
威 望:1
帖 子:10
专家分:6
注 册:2015-10-27
收藏
得分:0 
不好意思,忘记 scanf是输入指针的了,
scanf(" %d",p++);没有问题,在后面恢复指针就好了
2015-10-30 22:34
lzl123321
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:41
专家分:148
注 册:2015-10-15
收藏
得分:1 
回复 10楼 朔源
因为a[10]只是调用了a[0]到a[9]的地址,跟a[10]没有关系,换而言之,a[10]尚未被任何变量调用,a[9]地址+4倍分配给i因该是巧合,你再运行一遍,看i是不是还是a[9]地址+4  
2015-10-31 02:02
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 18楼 lzl123321
巧合不巧合的,推荐你看本书《链接器与加载器》

总有那身价贱的人给作业贴回复完整的代码
2015-10-31 08:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
以下是引用TonyDeng在2015-10-30 17:04:36的发言:


x是一個變量,p也是一個變量,各自占用不同的地址,後者儲存的值是前者的地址,不是兩者的地址相同!兩個變量,由於創建它們的語句是緊鄰的,所以在棧中地址通常也是緊鄰的用指針訪問,當指針變量所儲存的值落入其他變量的位置,就可能破壞數據,這種動作C語言不檢查,是否允許,由程序的邏輯決定;另一種情況,訪問操作系統禁止或硬件不存在、不允許讀寫的地址,會在運行時報錯,這就是那著名的非法讀寫崩潰畫面的來源。


這裏說的是“變量”,變量是在棧中分配的。指針也是變量,同樣要占用棧空間。然而指針所指向的對象,卻既可以是變量,也可以是在堆中分配的數據體——後者必須用指針指向才能訪問。指針尋訪數據,是用一個對象(object)尋訪另一個對象(object),有兩個對象(object),初學者常犯的錯誤,是把指針和它所指向的對象混淆!

[此贴子已经被作者于2015-10-31 11:10编辑过]


授人以渔,不授人以鱼。
2015-10-31 10:58
快速回复:数组指针指向问题! 求解惑!
数据加载中...
 
   



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

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