C语言指针的问题

[复制链接]
查看11 | 回复5 | 2008-8-7 11:11:39 | 显示全部楼层 |阅读模式
看下面这个程序:
#include
main()
{int a=10,b=20;
float x=2.5;
int *p=&a;
printf("%d",*p);
p++;
printf("%d",*p);
}
程序运行的结果是10 20,也就是第一次的输出结果是10,第二次输出的结果是20;这时为什么啊?第一次的输出结果我知道是什么原因,可是第二次的输出结果为什么是20呢,这个我就不懂了。谁能告诉我啊,谢谢了。
这里a和b有关系吗?好象这个程序里没有说a和b的关系吧?

回复

使用道具 举报

千问 | 2008-8-7 11:11:39 | 显示全部楼层
楼主一定搞错了吧,你写的这个程序上机运行的结果并不想你所说的答案;程序应该修改:int a=10,b=20; 替换为:int a[2]={10,20};int *p=&a; 替换为:int *p=a;其他不变,这样就符合答案了.下边解释原因:用一位数组存储变量,系统给数组分配连续的内存空间,数组名a就是数组的首地址,p首先指向数组的首地址,即指向了a[0]的地址,p++后,指针后移指向第二个数组元素即a[1];懂了吗?
回复

使用道具 举报

千问 | 2008-8-7 11:11:39 | 显示全部楼层
这是巧合 是碰巧电脑把a和b储存在相邻的两个地址里,所以p++后就向后移动了个地址就指向b了是没有关系的,但是他们总得存在内存里啊,他们虽然没有直接的关系,但在这里,它们在内存里所“居住”的地址相邻,就是邻居,而p又是指针,是指向地址的,p++了,说明p就指向a的“下一户人家”了,那么就正好是指向b了
回复

使用道具 举报

千问 | 2008-8-7 11:11:39 | 显示全部楼层
我觉得大概是这样的。。。你定义两个整形变量a,b然后是一个指向整形的指针P,这时候a和b就相当于在内存的100号和102号,第一个输出的P肯定是指向100号P的内容,也就是A的10,然后,P++,也就变成指向102号了。。然后这里面正好是你输入的B的地址,所以,下面就指向20了。。。呼呼。。。我也是新手。。。有问题大家一起讨论哈~
回复

使用道具 举报

千问 | 2008-8-7 11:11:39 | 显示全部楼层
内存为变量分配内存地址巧合引起的,使得a,b变量的地址挨着了,自然指针加一就指向b变量的地址,不过这样用是很危险的,不能随便就把指针加一或减一,会引起内存出错的,除非是在数组中,因为那里数组中各元素之间地址就是自增一的。
回复

使用道具 举报

千问 | 2008-8-7 11:11:39 | 显示全部楼层
这个跟你变量定义顺序有关,int a=10,b=20;在内存中的地址是连续的,p++后正好指向b,而且b的类型也是int,所以才没出错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行