zhangyachen / zhangyachen.github.io

zhangyachen's blog
274 stars 39 forks source link

《C与指针》 习题8.7.1 课后答案错误 #127

Closed zhangyachen closed 6 years ago

zhangyachen commented 7 years ago

《C与指针》第8章课后问题8.7.1 :

根据下面给出的声明和数据,对每个表达式进行求值并写出它的值。在对每个表达式进行求值时使用原先给出的值(也就是说,某个表达式的结果不影响后面的表达式)。假定ints数组在内存中的起始位置是100,整型值和指针长度都是4个字节。
int ints[20] = {
        10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200
};
(Other declarations)
int *ip = ints + 3;

我们只关注原题目中三个表达式的求值 :

ints
&ints
&ints + 4

写了个程序验证一下 :

#include <stdio.h>

int main(void) {

    int ints[20] = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200};
    int *ip = ints + 3;

    printf("%p,%p,%p",ints,&ints,&ints+4);
    return 0;
}

输出 :

0x7fff5dd63a00,0x7fff5dd63a00,0x7fff5dd63b40

很明显,0x7fff5dd63b40 = 0x7fff5dd63a00 + 140(320的十六进制表示)。与我的想法一致。

但是,该课后答案的错误在网上没有找到,也没有在原书的勘误表中找到。所以先记下来,希望有人能看到这篇文章,进而证实我想法的正确性,或者指出我的错误。

gaojulong commented 6 years ago

include

void main(){ int ints[20] = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200}; int *ip = ints + 3; printf("%p\n",ints); printf("%p\n",&ints); printf("%p\n\n",ints+4);

printf("%d\n",ints);
printf("%d\n",&ints);
printf("%d\n",ints+4);

} 输出结果: 0018FEF8 0018FEF8 0018FF08

1638136 1638136 1638152

参考一下!

gaojulong commented 6 years ago

答案应该是以%d十进制输出地址的吧