如果我传递一个变量的地址,我是否必须返回?

时间:2016-11-15 10:04:25

标签: c pointers global-variables parameter-passing pass-by-reference

如果我有一个根据某些规则递增全局变量的函数并且我通过引用传递一个变量,我是否必须返回或者是否会更新变量?这也适用于局部变量吗?例如:

static uint8_t counter = 1;

void add(uint8_t *variable)
{
   if (*variable == 5)
   {
    *variable = 7;

   } else if (*variable == 20)
   {
    *variable = 1;
   } else
   {
    *variable++;
   }
}

我打电话给'添加'功能在某处:

void function(void)
{
... some code...
add(&counter);
... some code...
}

4 个答案:

答案 0 :(得分:2)

此代码适用于任何类型的变量,无论它是全局变量还是本地变量,因为该对象是通过引用传递的。

然而,更好的接口是当函数返回它作为参数获得的指针时。

uint8_t * add(uint8_t *variable)
{
   if (*variable == 5)
   {
    *variable = 7;

   } else if (*variable == 20)
   {
    *variable = 1;
   } else
   {
    *variable++;
   }

  return variable;
}

在这种情况下,您可以组合函数的调用或将其与等待相同指针的其他函数一起使用。例如

add( add( &counter ) );

SomeOtherFunction( add( &counter ) );

在多线程环境中调用函数并且全局变量没有存储类说明符_Thread_local时存在差异。

答案 1 :(得分:1)

避免使用全局变量。

如果你必须使用全局变量,你根本不需要传递它 - 你可以直接修改它,即你既不需要传递也不需要返回它。

static uint8_t counter = 1;

void add(void)
{
   if (counter == 5) {
    counter = 7;
   } else if (counter == 20) {
    counter = 1;
   } else {
    counter++;
   }
}

如果您使用的是现有接口add(),它需要适用于全局变量和从函数传递的一些局部变量。 然后你的现有函数就好了,你不需要返回任何东西,因为你是要修改和更新其内容的变量的地址。

答案 2 :(得分:0)

对于全局(文件范围)变量,根本不需要将其显式传递给函数。它已经在全局范围内并且可以从所有函数(块范围)访问,提供您在本地(内部)范围内没有相同名称的另一个本地标识符。

那就是说,对于到点的答案,不,你不需要返回更新的值,它已经反映在实际参数({ {1}})传递给函数。对于全局范围变量和非全局范围变量,这都是相同的。

答案 3 :(得分:0)

全局变量具有整个文件的可见性,因此您传递其地址的函数是已知的。

为什么在函数中可见全局变量时需要指针?

您只需更改它的值,并且在调用函数中可以看到更改的值。

如果您的问题是非全局变量,那么

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div>
<h1>Data Entry Form</h1>
<div class="row form">        
<div class="col-xs-8">
    <div class="row">
        <div class="form-group col-xs-3">
            <label for="Callsign">Callsign: VH-</label>
        </div>
        <div class="form-group col-xs-4">
            <input class="form-control" name="Callsign" />
        </div>
        <div class="form-group col-xs-1">
            <label for="acType">Type:</label>
        </div>
        <div class="form-group col-xs-4">
            <input class="form-control" name="acType" />
        </div>        
    </div>
    <div class="row">
        <div class="form-group col-xs-4">
            <label for="Description">Description:</label>
        </div>
        <div class="form-group col-xs-8">
            <textarea class="form-control" name="Description"></textarea>
        </div>                
    </div>
</div>
</div>
</body>

无需从函数返回任何内容,因为您传递的是变量的地址,并且在调用函数中可以看到对该位置所做的更改