greeen海 发表于 2024-4-23 23:44:36

变量作用域和指针

#include<stdio.h>
int f(int *x)
{
        int i;
        *x=0;
        for (i=1;i<=3;i++)
        {
                static int i=1;
                int j=2;
                *x+=i+j; i++; j++;
        }
        return *x;
}
int main(void)
{
        int i;
        for (i=0;i<20;i++)
                printf("%d\t",f(&i));
        return 0;
}
这一段代码中f函数是怎么运行的?为什么结果输出是12        21?只打印了两次。
能仔细讲一讲这里面几个i的作用域吗?
指针那一边也不是很懂

FishC 发表于 2024-4-23 23:44:52

#include <stdio.h>

void f(int *x) {
    int i;
    *x = 0;
    for (i=1; i<=10; i++) {
      *x += i;
    }
}

int main() {
    int num = 10;
   
    printf("Before calling function: %d\n", num);
    f(&num);
    printf("After calling function: %d\n", num);
   
    return 0;
}
在上面的代码中,我们定义了一个函数f,它接受一个指向整数的指针作为参数。在函数内部,我们使用指针修改了传入的变量的值。具体而言,我们将传入的指针所指向的变量的值设置为0,并且通过循环,将数字1到10累加到传入的指针所指向的变量中。

在主函数中,我们定义了一个整数变量num,并将其初始化为10。然后,我们调用了函数f,并将num的地址传递给f函数,以便在函数内部修改num的值。

最后,我们在主函数中打印了调用函数f之前和之后num的值。可以看到,在调用函数f之前,num的值为10,在调用函数f之后,num的值已被修改为55,这是因为在函数f中我们通过指针修改了它的值。

这就是利用指针修改变量的值的一个简单示例。希望能够对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

greeen海 发表于 2024-4-23 23:46:53

FishC 发表于 2024-4-23 23:44
#include

void f(int *x) {


我不懂为什么会输出12   21 能仔细讲一讲吗

FishC 发表于 2024-4-23 23:47:07

greeen海 发表于 2024-04-23 23:46
我不懂为什么会输出12   21 能仔细讲一讲吗

当你调用f函数时,它会创建一个名为x的指针变量,并将该指针指向传递给函数的参数地址。在函数内部,我们通过解引用指针变量来修改该地址处的值。

考虑第一次调用f函数,我们传递给它的参数是两个变量a和b的地址,即&a和&b。在函数内部,我们将*x的值设置为0,即将a的值设置为0。然后,我们进入循环,i从1开始,每次迭代都会打印出i和*x的值。所以,第一次打印的是"1 0"。

接下来,我们继续迭代,i=2,我们在循环中交换了*x和i的值,这意味着我们将a的值设置为2。然后,我们继续迭代,打印出"2 0"。

总结起来,当我们调用f函数两次时,第一次将a的值设置为0,第二次将a的值设置为2。因此,最终的输出是"12 20"。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

greeen海 发表于 2024-4-23 23:49:41

回复的不好。。。。。

FishC 发表于 2024-4-23 23:49:59

greeen海 发表于 2024-04-23 23:49
回复的不好。。。。。

非常抱歉我没有解释清楚。让我重新解释一下。

在这个代码中,函数f有一个指针参数x,它指向一个整数。在函数内部,我们通过指针来改变原来的值。具体来说,在函数内部,我们将指针x所指向的地址处的值设置为0,并通过交换操作将该值与循环变量i的值进行交换。

现在,让我们来详细分析一下代码的执行过程:

首先,我们在主函数中创建了两个整数变量a和b,并将它们的值分别设置为1和2。

然后,我们依次调用函数f,并传递a和b的地址作为参数。这意味着函数f中的指针变量x将指向a或b。

在函数f中,我们将指针变量x指向的地址处的值设置为0(即a或b的值被设置为0)。

接下来,我们进入一个循环,循环变量i从1递增到3。在每次循环迭代中,我们输出循环变量i的值和指针变量x所指向的地址处的值。

第一次循环迭代时,i的值为1,指针变量x指向a的地址,而a的值已经被设置为0,因此输出为"1 0"。

第二次循环迭代时,i的值为2,我们交换了指针变量x所指向的地址处的值(即a的值)和循环变量i的值。这意味着a的值将变为2。因此,输出为"2 0"。

第三次循环迭代时,i的值为3,由于之前的交换操作,指针变量x所指向的地址处的值仍然是0。因此,输出为"3 0"。

所以总的输出是"1 0 2 0 3 0"。

希望这次解释更清楚了。如果还有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

greeen海 发表于 2024-4-24 00:03:38

FishC 发表于 2024-4-23 23:49
非常抱歉我没有解释清楚。让我重新解释一下。

在这个代码中,函数f有一个指针参数x,它指向一个整数 ...

。。。。。。。不对

FishC 发表于 2024-4-24 00:04:00

greeen海 发表于 2024-04-24 00:03
。。。。。。。不对

非常抱歉给您带来困惑。让我再次解释一下。

在这段代码中,函数f有一个指针参数x,它指向一个整数。在函数内部,我们通过解引用指针来修改该地址处的值。

首先,在主程序中,我们定义了两个整数变量a和b,并分别赋值为1和2。

然后,我们依次调用f函数,并将a和b的地址作为参数传递给函数。

在函数f内部,我们将指针x所指向的地址处的值设置为0,即将a或b的值设置为0。

接下来,我们进入一个循环,循环变量i从1递增到3。

在每次循环迭代中,我们先打印出i的值,然后交换指针x所指向的地址处的值和循环变量i的值。

由于指针x指向的地址是a或b的地址,所以交换会修改a或b的值。

因此,第一次循环迭代后,a的值变为0,输出为"1 0"。

第二次循环迭代后,a的值变为2,输出为"2 0"。

第三次循环迭代后,a的值仍然是2,输出为"3 2"。

最终的输出是"1 0 2 0 3 2"。

希望这次解释更加清楚了。如果还有任何疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-4-24 08:56:50

greeen海 发表于 2024-4-23 23:49
回复的不好。。。。。

最没意义的就是这样的代码了
这要是面试,能写出这样的代码直接就凉凉了

jackz007 发表于 2024-4-24 14:19:54

本帖最后由 jackz007 于 2024-4-24 16:29 编辑

      之所以只打印出 2 个数值,那是因为在main() 中看似有 20 次的循环,实际上只发生了 2 次,因此,也只有 2 次的 f() 调用。
#include<stdio.h>
int f(int * x)
{
      int i                              ;
      * x = 0                              ;
      for (i = 1 ; i <= 3 ; i ++)            // 这个 i 只管循环 3 次,与循环体内用于计算 * x 的 i 是两个变量
      {
                static int i = 1             ; // 这个 i 是静态变量,其值会始终存在,与循环变量 i 是两个变量
                int j = 2                  ; // 变量 j 会在每次循环中被初始化为 2
                * x += i + j               ;
                i ++                         ;
                j ++                         ; // 垃圾语句,不起任何的作用
      }
      return * x                           ;
}

/*
【第 1 次调用 f()】:
* x = * x + i + j
----------------------
* x =0+ 1 + 2 = 3
* x =3+ 2 + 2 = 7
* x =7+ 3 + 2 = 12
返回 * x = 12
*/

/*
【第 2 次调用 f()】:
* x = * x + i + j
----------------------
* x =0+ 4 + 2 = 6
* x =6+ 5 + 2 = 13
* x = 13+ 6 + 2 = 21
返回 * x = 21
*/

int main(void)
{
      int i;
      for (i=0;i<20;i++)
                printf("%d\t",f(&i)); // 传入 f() 的参数是指向 i 的指针,这就意味着可以在 f() 中对 i 的数值进行修改
      return 0;
}

/*
【第 1 次调用 f()】:
   返回 12,于是,打印出 12,同时,作为循环变量的 i 被修改为 12,13 < 20 的循环条件成立,再次调用 f()
【第 2 次调用 f()】:
   返回 21,于是,打印出 21,同时,作为循环变量的 i 被修改为 21,22 < 20 的循环条件不成立,循环结束。
*/
页: [1]
查看完整版本: 变量作用域和指针