指针问题。初学。。帮帮

happy-man 2009-05-17 10:43:14
#include "stdio.h"
void main()
{int a=3,b=4,c=5,*p=&a,x;
printf("%x,%x,%x,%x\n",&a,&b,&c,p);
p++;x=(*p)++;
printf("%d,%d,%d,%d,%d\n",a,b,c,*p,x);}
TC下运行结果输出:__________
fda,fdc,fde,fda
3,5,5,5,4

输出结果不懂。。高手解释下。。。
...全文
209 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Adaquan 2009-05-19
  • 打赏
  • 举报
回复
按照正常情况下,函数中的变量地址从高地址向低地址分配,p++这个就是一个未知的东西,输出的东西按道理说
也是未知的,有想法请指教!!
jiyan1221 2009-05-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hairetz 的回复:]
#include "stdio.h"
void main()
{int a=3,b=4,c=5,*p=&a,x;
printf("%x,%x,%x,%x\n",&a,&b,&c,p);
p++; //这里只发生了一件事情,内存越界,其他的不想多说
x=(*p)++;
printf("%d,%d,%d,%d,%d\n",a,b,c,*p,x);}
[/Quote]
这个跟编译器是不是有关系?一定会越界吗?
当然我明白这么写是不对滴。。
  • 打赏
  • 举报
回复
#include "stdio.h"
void main()
{int a=3,b=4,c=5,*p=&a,x;
printf("%x,%x,%x,%x\n",&a,&b,&c,p);
p++; //这里只发生了一件事情,内存越界,其他的不想多说
x=(*p)++;
printf("%d,%d,%d,%d,%d\n",a,b,c,*p,x);}
xiaox2y2 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 LYPC1988 的回复:]
我还是用代码说话吧!

C/C++ code
#include "stdio.h"

#include <iostream>
using namespace std;

void main()
{
int a=3,b=4,c=5;
int *p=&a; // 这是一个指向a地址的空间的指针,打印输出和a的地址是一样的。
int x;

// 这里打印输出变量 a,b,c的地址
printf("%x,%x,%x,%x\n",&a,&b,&c,p);

p++;
// 指针指向下一个变量地址,在32位机器是向后偏移4字节
// 这时候指…
[/Quote]
强烈顶!!!我觉得楼主的输出太巧合了
smart_fish8 2009-05-18
  • 打赏
  • 举报
回复
第一次输出的是地址,第二次输出的是数值
sunchao365 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 LYPC1988 的回复:]
我还是用代码说话吧!

C/C++ code
#include "stdio.h"

#include <iostream>
using namespace std;

void main()
{
int a=3,b=4,c=5;
int *p=&a; // 这是一个指向a地址的空间的指针,打印输出和a的地址是一样的。
int x;

// 这里打印输出变量 a,b,c的地址
printf("%x,%x,%x,%x\n",&a,&b,&c,p);

p++;
// 指针指向下一个变量地址,在32位机器是向后偏移4字节
// 这时候指…
[/Quote]


顶。。。。。。。。。。。。
wangxiangdong_sl 2009-05-18
  • 打赏
  • 举报
回复
这用代码说话:
#include "stdio.h"
void main()
{
int a=3,b=4,c=5,*p=&a,x; //指针p指向a,实际上*p的值和a是一回事
printf("%x,%x,%x,%x\n",&a,&b,&c,p); //分别输出a、b、c变量的16进制地址,不是内容,最后一句输出p的内容,但由于p指针指向的是a,所以它的内容是a的地址。所以和第一个输出相等。
p++;x=(*p)++; //第一句:p++应当严禁使用,随然一般不报错误,第二句相当于把p指针指向的内容加1附给x;但由于前面的指针的改变,返回的数不一定。
printf("%d,%d,%d,%d,%d\n",a,b,c,*p,x);} //这个就不用说了吧
liliangbao 2009-05-18
  • 打赏
  • 举报
回复
//&表示取地址,所以输出a,b,c,a(p指向a)的地址
printf("%x,%x,%x,%x\n",&a,&b,&c,p);

p++; //这样做其实是非法访问,就是指向地址为&a+4的空间,具体是否是b的地址和环境有关~
x=(*p)++; //非法操作内存~

//输出变量的值
printf("%d,%d,%d,%d,%d\n",a,b,c,*p,x);
  • 打赏
  • 举报
回复
我顶一个
LYPC1988 2009-05-17
  • 打赏
  • 举报
回复
我还是用代码说话吧!

#include "stdio.h"

#include <iostream>
using namespace std;

void main()
{
int a=3,b=4,c=5;
int *p=&a; // 这是一个指向a地址的空间的指针,打印输出和a的地址是一样的。
int x;

// 这里打印输出变量 a,b,c的地址
printf("%x,%x,%x,%x\n",&a,&b,&c,p);

p++;
// 指针指向下一个变量地址,在32位机器是向后偏移4字节
// 这时候指向的地址空间的值是不知道的,只有编译器知道。
// 到底指向了哪里就要看你使用了那种编译器咯。

x=(*p)++;
// 这里是使p指向的地址空间的值(假设为yy)付给x,然后再yy++
// 即分解为:x=yy;++yy;这两步骤

// 这是打印的值是 3,(4或5),5,(5或?),(4或?),依使用的编译器而定
printf("%d,%d,%d,%d,%d\n",a,b,c,*p,x);
}

/*
在不同的编译器打印输出的结果是不一致的:
BCB编译器:
12ff50,12ff4c,12ff48,12ff50
3,4,5,1245057,1245056

Digital Mars编译器:
12ff34,12ff38,12ff3c,12ff34
3,5,5,5,4
这里我们看到变量的地址是按先后顺序分配的,Turbo C的编译器和他大概相似。
(p++)后使p指向了b的地址空间。

GCC/G++编译器下:
240ff24,240ff20,240ff1c,240ff24
3,4,5,37814121,37814120
*/
nadoo 2009-05-17
  • 打赏
  • 举报
回复
虽然如果编译器按顺序连续分配空间的话,p++ = &b, 但是感觉这样很不好。
black_night 2009-05-17
  • 打赏
  • 举报
回复
printf("%x,%x,%x,%x\n",&a,&b,&c,p); //输出地址,p=a
p++;x=(*p)++; //p加后指向b,然后x=*p,*p=*p+1;
printf("%d,%d,%d,%d,%d\n",a,b,c,*p,x);
liao05050075 2009-05-17
  • 打赏
  • 举报
回复
&是取地址符,指针本来就指向一个内存地址,所以printf("%x,%x,%x,%x\n",&a,&b,&c,p); 输出都的是地址
而*是取得指针的内容,所以输出*p得到p所指向内存地址的内容

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧