第1个回答 2007-12-15
#include<stdio.h>
void main()
{
int a=100;
int *pointer_1;
pointer_1=&a; //a的地址赋给pointer_1,现在a的地址和指针pointer_1都指向x(假设这个地址是x),x中存放的值为100
printf("%d\n",(*pointer_1)++);//先计算*pointer_1,也就是100,输出,再将其值自加一次,也就是指针pointer_1和a的地址现在所值为101
printf("%d\n",*pointer_1++); //先输出pointer_1所指的值,上边一步已经计算,为101,再将pointer_1的地址自加,由于地址占4位,所以现在pointer_1的地址为x+4
printf("%d\n",*pointer_1);//此时由于地址x+4 处没有实值的存在,所以将输出一个随机值
}
第2个回答 2007-12-15
假定有某整型变量a,声明为:int a=100;
又有整型指针变量p,声明为:int *p; p = &a;
假定a在内存中的地址为0x11223344,则:
p=0x11223344
*p=100
此时:
*p++等同于*(p++),而p++表示将指针p后移一个单位类型长度,此处的p为int*型,因此后移1*sizeof(int)个单位长度,对于TC3,此时p=0x11223346。
而(*p)++只是将p指向的内存空间中的内容取出,加1,然后放回去。
如果p=0x22334455,而内存0x22334455中放了一个整数6,那么执行完(*p)++之后,0x22334455中的内容为7。但是(*p)++这个表达式的值为6。
=========================
顺带说一下“++”的含义。
假如a=2,b=40,看这两个式子:
(1) a=b++;
(2) a=++b;
对于(1)中的b++,是先取值,再自加1,整个表达式(“b++”)的值为取出来的b原先的值。
这个例子中,执行(1)之前a=2,b=40,执行(1)之后a=40,b=41。
对于(2)中的++b,是先自加1,再取值,整个表达式(“++b”)的值为自加以后的b的新值。
这个例子中,执行(1)之前a=2,b=40,执行(1)之后a=41,b=41。
另外,楼上关于“编译器会帮你保护数据”的说法是错误的。内存中,未使用的空间存放的数据是随机的,输出是0表示该地址对应的数据就是0,而不是为了保护数据而输出的0。具体可以在VC中自己打开debug模式下的memory窗口察看内存数据验证我的说法。
第3个回答 2007-12-15
printf("%d\n",*pointer_1++);
printf("%d\n",*pointer_1);
经过第一句把指针指向了下一个地址!!但下一个地址是不确定的,只是有些编译器会帮你保护数据而已,所以输出是0