我一直在使用John Hubbard编写的C ++编程,并遇到了这个问题:
执行以下代码后,确定每个指示变量的值。假设整数占用4个字节,
m
存储在内存中,从字节0x3ffd00
开始。
int m = 44;
int* p = &m;
int n = (*p)++;
int* q = p - 1;
r = *(--p) + 1;
++*q;
我们被要求找到
的值m
n
&m
*p
r
*q
代码执行后。
所以我理解r是对m的引用,并且n被赋予p的解除引用值,然后p递增。所以在那时m = r = 45且n = 44。我不明白是什么
int* q = p - 1;
r = *(--p) + 1;
++*q;
会做的。有人可以帮助我吗?
答案 0 :(得分:1)
p
不是对m
的引用; p
是指向m
的指针。指针和引用是不同的。q
被定义为紧接m
之前的整数的指针。那是在堆栈上的未定义位置。你确定这不会说“p + 1”,因为...... r = *(--p) + 1;
)递减p,取指针处的值,然后加1。除非上面有拼写错误,否则这是未定义的行为。++*q
再次在未定义的位置递增值 - 未定义的行为。提问者可能依赖(或诱惑你依赖)它减少并增加相同值的事实,但这仍然是未定义的行为。答案 1 :(得分:1)
递增和递增指针通常用在数组中。
当您递减/递增指针时,它不会递减/递增它指向的值。它的作用是,递增/递减其数据类型大小所指向的地址。
int m = 44;
int* p = &m;
int n = (*p)++; //n=45
int* q = p - 1; //q point to &m-(sizeof(int)) , value of address pointed to by q would be undefined and may even cause segfault once accessed
r = *(--p) + 1; //undefined, we don't know what is the value in address &m-1, then add 1 to its value. May even cause segfault.
++*q; //increment value pointed to by q(which is undefined and may even cause segfault)