• 全部
  • 问答

指针与地址问题,求救!

不胜人生一场醉 海南移动 项目总监  2003-07-01 11:01:09
#include <stdio.h>
#define SIZE 4
void printPtr(char *);
main()
{
int x=7,*xPtr;
char arrays[SIZE]={'a','b','c','\0'},*arraysPtr;
arraysPtr=arrays;
printPtr(arraysPtr);
printPtr(arrays);
}
void printPtr(char *ptr)
{
for(;*ptr!='\0';ptr++)
printf("%3c",*ptr);
printf("\n");
}

我在调试过程中,发现ptr="abc"

第一次循环ptr="abc"

第二次循环ptr="bc"

第三次循环ptr="c"

按理说应该是array[SIZE]的地址才对呀!
...全文
57 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
我知道了谢谢!
回复
zteliubin 2003-07-01
还没有明白,你调试的时候,调试窗口中打印的是ptr指向的内容!
ptr的值,你可以直接打印出来看

printf("%d --> %s",ptr,ptr);//同时打印ptr和ptr指向的内容!
回复
bigtea 2003-07-01
to 楼主,
改成printf("%3c,%x",*ptr,ptr);
就知道了,你在TC2中调试时因为编译系统预知你的ptr指针变量指向char类型变量,所以象
printf("%s",ptr);这样给你显示出来。
回复
我也是这么认为的,但调试中却发现实际是
第一次循环ptr="abc"

第二次循环ptr="bc"

第三次循环ptr="c"
回复
lzh7800 2003-07-01
第一次循环,ptr是指向"abc"的首地址,即'a'的地址,*ptr='a';
第二次循环,ptr是指向"bc"的首地址,即'b'的地址,*ptr='b';
第三次循环,ptr是指向"c"的首地址,即'c'的地址,*ptr='c'
回复
void printPtr(char *ptr)
{
for(;*ptr!='\0';ptr++)
{
printf("%3c",*ptr);
printf("%6p",ptr);
}
printf("\n");
}
输出的是 a FFA6 b FFA7 c FFA8
因此我想Ptr不应该是
第一次循环ptr="abc"

第二次循环ptr="bc"

第三次循环ptr="c"

而是
第一次循环ptr=FFA6
第二次循环ptr=FFA7
第三次循环ptr=FFA8

回复
兄弟用的turbo c2.0调试的
回复
playboyxp 2003-07-01
我在VC下调试的结果
a b c
a b c
有什么不对吗?
回复
gunsrose 2003-07-01
指针移动!!!!!!!
回复
hessian 2003-07-01
用 printf("%d",(int)ptr);就可以显示地址了吧!
回复
hessian 2003-07-01
事实上不是你想象中的那样。
首先两次printPtr调用时是将原来的实参的值(arraysPtr所指的地址,arrays的首地址)Copy一份给了函数的参数ptr。此时ptr按函数参数的声明只是一个指针,可以自由的做加减运算,无关数组首地址不可以重新赋值的限制。所以你在循环中对它做了++运算后就指向数组的下一个元素了。再将它输出,字符个数就越来越少了。
回复
arfi 2003-07-01
用vc调试的吗?你应该看到类似0x0065fdec "abc"的东西,前面的数字就是地址了,后面是该地址中的内容。
回复
Beover1984 2003-07-01
有点不明白你的意思
回复
zteliubin 2003-07-01
因为ptr是char *,所以你看到的ptr分别就是"abc","bc","c"了。
但是你的输出应该是:
a b c
abc

没有问题呀,你如果看*ptr的值就没有问题了!
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2003-07-01 11:01
社区公告
暂无公告