c - 用指针和地址更新整数

c - updating integers with pointers and addresses

所以下面的函数应该是将 1 加到 n 并在每次 scanf 读取 1 时打印出更新后的 n。 然而它没有更新并不断打印出 1

#include <stdio.h>
#include <stdlib.h>

void add_one(int *n);
void command(int x);
int
    main(int argc, char *argv[]) {

    int i;

    while (scanf("%d", &i) == 1){
        command(i);
    }
    return 0;

}

void add_one(int *n){
    int i = *n;
    i++;
    *n = i;
     printf("%d\n", i);
}

void command(int x){
    int n = 0;

    if (x == 1){
        add_one(&n);
    }
    else{
        return;
    }
}

你必须传递 x 而不是 n

  if (x == 1){
        add_one(&x);
  }

或者你必须用x初始化n并传递n。例如

  int n = x;
  if (x == 1){
        add_one(&n);
  }

虽然在我看来你的带有函数调用链的复杂代码没有多大意义。:)

看来你的意思如下

void add_one(int *n){
     printf("%d\n", ++*n);
}

void command(int x){
    static int n = 0;

    if (x == 1){
        add_one(&n);
    }
}

注意带有存储说明符static的函数命令中n的声明。

您将 n 作为 command 中的局部变量。每次从 main 调用 command 时,它都会从 0 开始。修复它的一种方法是将声明移动到 main 并将其传递给 command:

#include <stdio.h>
#include <stdlib.h>

void add_one(int *n);
void command(int x, int *n); /* second parameter added */
int
    main(int argc, char *argv[]) {

    int i, n = 0;   /* n added */

    while (scanf("%d", &i) == 1){
        command(i, &n);  /* &n added */
    }
    return 0;

}

void add_one(int *n){
    int i = *n;
    i++;
    *n = i;
     printf("%d\n", i);
}

void command(int x, int *n){
    /* int n = 0;   declaration moved to main */

    if (x == 1){
        add_one(n);  /* removed & since parameter n already is a pointer */
    }
    else{
        return;
    }
}

如果您在 if (x == 1) 闭包体中更改以下代码,它将起作用:

add_one(&n);

收件人:

add_one(&x)

在您的例子中,int n = 0;n 是函数 command() 的局部变量,并且具有 自动 存储持续时间,因此每次调用command() 会看到 new n。计算出的值不会被保留.

解决方案:要么

  1. 定义 nstatic.
  2. n设为全局变量。

完全不清楚您要完成的任务。您要 command 更新 maini 的值吗?如果是这样,那么您必须将指向 i 的指针传递给 command:

while ( scanf( "%d", &i ) == 1 )
  command( &i );

这当然会改变 command 的定义:

void command( int *x )
{
  if ( *x == 1 )
    add_one( x );  // x is already a pointer
}

注意add_one中的i变量是多余的;你可以简单地写

void add_one( int *n )
{
  *n += 1;
  printf( "%d\n", *n );
}

如果您希望commandmain中更新i,那么您将通过i正如你现在所做的那样:

while( scanf( "%d", &i ) == 1 )
  command( i );

command 的变化是

void command( int x )
{
  if ( x == 1 )
    add_one( &x );
}

这会更新 command 中的参数 x,但由于 xlocalcommand,它不会'不会影响 main 中的 i