指针*(p++)和*++p

来源:百度知道 编辑:UC知道 时间:2024/07/15 20:15:58
#include <stdio.h>

int main(void)
{
int a, tm;
int *p, *t;

/* *(p++) */
printf("/--- tm=*(p++) ---/\n");
a = 100;
p = &a;
tm = *(p++);
printf("a=%d, *p=%d, p=%d, tm=%d, &tm=%d\n", a, *p, p, tm, &tm);
问1:*(p++)我认为,应该先计算(p++),再计算*。但是书上说是先计算*p,再计算p++。为什么这样计算呢?(请按编译步骤一步一步详细解答。)

/* *++p */
printf("/--- tm=*++p ---/\n");
a = 100;
p = &a;
tm = *++p;
printf("a=%d, *p=%d, p=%d, tm=%d, &tm=%d , &a=%d\n", a, *p, p, tm, &tm, &a);
问2:按照步骤应该先计算++p,即这时p指向变量tm;再计算*,即tm = tm。那为什么tm没有初始化,系统却不报错呢?
假设不报错,开始的时候tm开始的时候没有初值,tm变量里应该是一个随机数,即*++p应该为一个随机数,那为什么tm=100呢?难道是我的理解上出错呢?到底应该怎样理解?(请按编译步骤一步一步详细解答。)

printf("\n");
return 0;
}

问3:有没有讲解C语言对系统内存管理这方面的教材?请指点一本讲解全面、详细,简单易懂的教材,电子档或书名都可以。谢谢!

int main(void)
{
int a, tm;
int *p, *t;

/* *(p++) */
printf("/--- tm=*(p++) ---/\n");
a = 100;
p = &a;
tm = *(p++); //等价于 tm=*p; p++; 故tm变为100.
// *(p++)中, p与++(而不是*号)先结合, 这个"先"的含义是运算符谁跟谁结合在一起的意思,而不是时间上的先后. ++因为在p之后, 在时间上来说, 仍然是tm=*p完成之后才进行的自加.

printf("a=%d, *p=%d, p=%d, tm=%d, &tm=%d\n", a, *p, p, tm, &tm);
问1:*(p++)我认为,应该先计算(p++),再计算*。但是书上说是先计算*p,再计算p++。为什么这样计算呢?(请按编译步骤一步一步详细解答。)

/* *++p */
printf("/--- tm=*++p ---/\n");
a = 100;
p = &a;
tm = *++p; //tm碰巧在a之后, 所以这句相当于 tm=tm. 但是请注意: a与tm的相对位置, 在不同的编译器中, 处理方式可能不同. 不要认为tm一定在a后面.
printf("a=%d, *p=%d, p=%d, tm=%d, &tm=%d , &a=%d\n", a, *p, p, tm, &tm, &a);
问2:按照步骤应该先计算++p,即这时p指向变量tm;再计算*,即tm = tm。那为什么tm没有初始化,系统却不报错呢?
假设不报错,开始的时候tm开始的时候没有初值,tm变量里应该是一个随机数,即*++p应该为一个随机数,那为什么tm=100呢?难道是我的理解上出错呢?到底应该怎样理解?(请按编译步骤一步一步详细解答。)

printf("