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
。计算出的值不会被保留.
解决方案:要么
- 定义
n
为 static
.
- 将
n
设为全局变量。
完全不清楚您要完成的任务。您要 command
更新 main
中 i
的值吗?如果是这样,那么您必须将指向 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 );
}
如果您不希望command
在main
中更新i
,那么您将通过i
正如你现在所做的那样:
while( scanf( "%d", &i ) == 1 )
command( i );
command
的变化是
void command( int x )
{
if ( x == 1 )
add_one( &x );
}
这会更新 command
中的参数 x
,但由于 x
是 local 到 command
,它不会'不会影响 main
中的 i
。
所以下面的函数应该是将 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
。计算出的值不会被保留.
解决方案:要么
- 定义
n
为static
. - 将
n
设为全局变量。
完全不清楚您要完成的任务。您要 command
更新 main
中 i
的值吗?如果是这样,那么您必须将指向 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 );
}
如果您不希望command
在main
中更新i
,那么您将通过i
正如你现在所做的那样:
while( scanf( "%d", &i ) == 1 )
command( i );
command
的变化是
void command( int x )
{
if ( x == 1 )
add_one( &x );
}
这会更新 command
中的参数 x
,但由于 x
是 local 到 command
,它不会'不会影响 main
中的 i
。