70,037
社区成员
发帖
与我相关
我的任务
分享//&表示取地址,所以输出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);
#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
*/