有关指针和参数的问题,摘自《在 Mac 上学习 C,第二版》第七章练习

问题描述 投票:0回答:1

发表这篇文章的原因是因为我很难理解《在 Mac 上学习 C,第二版》中的“第七章练习”中的几个问题。

a部分:

//  the following code is part a, of question 1
void add_one(int *my_var);

int main(int argc, const char * argv[]) {
    
    int num, i;
    
    num = 5;
    
    for (i = 0; i < 20; i++) {
        add_one(&num);
//        printf("Num equals: %d\n", num);
    }
    
    printf("Final value is %d.\n", num);
    
    return 0;
}

void add_one(int *my_var)
{
    (*my_var) ++;
}

b 部分:

//  the following code is part b, of question 1
int g_number;
int multiply_it(int my_var);

int main(int argc, const char * argv[]) {
    
    int i, g_number = 2;
    
    for (i = 1; i <= 2; i++) {
        g_number *= multiply_it(g_number);
//        printf("Global number equals: %d\n", g_number);
    }
    
    printf("Final value is %d.\n", g_number);
    
    return 0;
}

int multiply_it(int my_var) {
    return (my_var * g_number);
}

c 部分:

//  the following code is part c, of question 1

int g_number;
int double_it(int my_var);

int main(int argc, const char * argv[]) {
    
    int i;
    
    g_number = 1;
    
    for (i = 1; i <= 10; i++) {
        g_number *= double_it(g_number);
    }
    
    printf("Final value is %d.\n", g_number);
    
    return 0;
}

int double_it(int my_var) {
    return 2 * my_var;
}

在书的后面,他们给出了b部分的最终值,为“512”;对于 c 部分,为“1024”。

我理解他们如何得出 a 部分的答案,但我很难理解他们对 b 和 c 部分得到的答案。

这三个不同的部分在教科书中以代码片段的形式呈现,但问题的一部分是每个部分都有自己的 main()。我不确定为什么以这种方式呈现,但我尝试注释掉其他 main() 声明行(其中的代码除外)。

当我尝试组合 a 和 b 部分时,a 部分将输出正确答案(25),但 b 部分将输出值“0”。所以,我什至还没有尝试c部分。因为 c 部分是 b 部分的两倍,所以我假设如果我能算出 b 部分,我就能算出 c 部分。

有没有人可以帮助我理解这一点,或者指出我可以理解答案的方向?

提前感谢您的帮助!

c pointers parameters
1个回答
0
投票

首先,全局整型变量在声明时被初始化为 0。 因此,代码中的 b 部分,

int g_number;
将设置为 0。

其次,函数

g_number
中的
multiply_it()
指的是全局变量,其值为0。因此,它会返回0,因为
myvar * 0
始终为0。

int multiply_it(int my_var) {
    return (my_var * g_number);
}

我的猜测是你的局部变量

g_number
不应该被声明。相反,全局变量应该分配给 2。

这个应该是

int i, g_number = 2;

像这样

int i;
g_number = 2;

它按预期打印 512。

© www.soinside.com 2019 - 2024. All rights reserved.