关于C语言中的指针学习

相关代码如下:
#include<stdio.h>
void main()
{
int a=100;
int *pointer_1;
pointer_1=&a;
printf("%d\n",(*pointer_1)++);
printf("%d\n",*pointer_1++);
printf("%d\n",*pointer_1);
}
最后我的输出结果是:
10
11
0
我想不通为什么最后一个是0呢!我也知道原因出在printf("%d\n",*pointer_1++);这里,可是我就是想不明白,谁能为我解释一下吗?还有到底++在右边到底是表示什么含义?老师说像*pointer_1++这样意思是把++之前的先计算完毕再++,可好像上面的第二行是先把指针变量++了再*的所以导致是0吧,到底是我对还是老师对呀!请大虾为我解释以下三种情况具体代表什么意思好吗?
*pointer_1++
(*pointer_1)++
*(pointer_1++)
小弟感激不尽!!
另外 我用的工具是TB3.0的哈
请问1楼他是如何把指针移到下一位的 计算的先后顺序是怎样 能说清楚一点吗? 谢谢

printf("%d\n",(*pointer_1)++); //先输出(*pointer_1)的值100,之后,再对(*pointer_1)即a做自增运算,a的值变为101。
printf("%d\n",*pointer_1++); //先输出*pointer_1的值101,之后,再对pointer_1做自增运算,pointer_1指向内存中变量a的下一个内存空间!因为此句比上句少一括号,故自增的对象不同。
printf("%d\n",*pointer_1); //输出pointer_1指向的空间的值。但a之后内存值不确定!

*pointer_1++ //先计算*pointer_1,再计算pointer_1++
(*pointer_1)++ //先计算*pointer_1,再对pointer_1指向的变量进行++
*(pointer_1++) //同第一个,先计算*pointer_1,再计算pointer_1++
温馨提示:内容为网友见解,仅供参考
第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
相似回答
大家正在搜