如果我传递一个变量的地址,我是否必须执行 return?
If I pass an address of a variable do I have to do a return?
如果我有一个根据某些规则递增 global 变量的函数,并且我通过引用传递一个变量,我必须执行 return 还是会无论如何都要更新变量?这也适用于局部变量吗?例如:
static uint8_t counter = 1;
void add(uint8_t *variable)
{
if (*variable == 5)
{
*variable = 7;
} else if (*variable == 20)
{
*variable = 1;
} else
{
*variable++;
}
}
我在某处调用 'add' 函数,例如:
void function(void)
{
... some code...
add(&counter);
... some code...
}
避免全局变量。
如果您确实必须使用全局变量,则根本不需要传递它 - 您可以直接修改它,即您既不需要传递也不需要 return 它。
static uint8_t counter = 1;
void add(void)
{
if (counter == 5) {
counter = 7;
} else if (counter == 20) {
counter = 1;
} else {
counter++;
}
}
如果您使用的是现有接口 add()
,该接口需要同时适用于全局变量和一些从函数传递的局部变量。
那么你现有的函数就可以了,你不需要 return 任何东西,因为你是你想要修改和更新其内容的变量的地址。
对于全局(文件范围)变量,您根本不需要将其显式传递给函数。它已经在全局范围内并且可以从所有函数(块范围)访问,提供你在本地(内部)范围内没有另一个同名的本地标识符。
也就是说,对于 到点 的回答,不,您不需要 return 更新值,它已经反映在 实际参数 (counter
) 传递给函数。这对于全局范围和非全局范围变量都是相同的。
全局变量在您的文件中具有可见性,因此您将其地址传递给的函数是已知的。
当全局变量在函数中可见时,为什么需要指针?
您可以只更改它的值,并且更改后的值在调用函数中可见。
如果您的问题是针对非全局变量的,那么
void func(int *q);
int main()
{
int a;
func(&a);
printf("%d \n",a);
}
void func(int *q)
{
*q = 10;
}
不需要 return 函数中的任何内容,因为您正在传递变量的地址,并且对位置所做的更改在调用函数中可见
此代码适用于任何类型的变量,无论它是全局变量还是局部变量,因为对象是通过引用传递的。
然而,更好的接口是当函数 returns 它作为参数获得的指针时。
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 ) );
在多线程环境下调用函数时存在差异,全局变量没有存储 class 说明符 _Thread_local。
如果我有一个根据某些规则递增 global 变量的函数,并且我通过引用传递一个变量,我必须执行 return 还是会无论如何都要更新变量?这也适用于局部变量吗?例如:
static uint8_t counter = 1;
void add(uint8_t *variable)
{
if (*variable == 5)
{
*variable = 7;
} else if (*variable == 20)
{
*variable = 1;
} else
{
*variable++;
}
}
我在某处调用 'add' 函数,例如:
void function(void)
{
... some code...
add(&counter);
... some code...
}
避免全局变量。
如果您确实必须使用全局变量,则根本不需要传递它 - 您可以直接修改它,即您既不需要传递也不需要 return 它。
static uint8_t counter = 1;
void add(void)
{
if (counter == 5) {
counter = 7;
} else if (counter == 20) {
counter = 1;
} else {
counter++;
}
}
如果您使用的是现有接口 add()
,该接口需要同时适用于全局变量和一些从函数传递的局部变量。
那么你现有的函数就可以了,你不需要 return 任何东西,因为你是你想要修改和更新其内容的变量的地址。
对于全局(文件范围)变量,您根本不需要将其显式传递给函数。它已经在全局范围内并且可以从所有函数(块范围)访问,提供你在本地(内部)范围内没有另一个同名的本地标识符。
也就是说,对于 到点 的回答,不,您不需要 return 更新值,它已经反映在 实际参数 (counter
) 传递给函数。这对于全局范围和非全局范围变量都是相同的。
全局变量在您的文件中具有可见性,因此您将其地址传递给的函数是已知的。
当全局变量在函数中可见时,为什么需要指针?
您可以只更改它的值,并且更改后的值在调用函数中可见。
如果您的问题是针对非全局变量的,那么
void func(int *q);
int main()
{
int a;
func(&a);
printf("%d \n",a);
}
void func(int *q)
{
*q = 10;
}
不需要 return 函数中的任何内容,因为您正在传递变量的地址,并且对位置所做的更改在调用函数中可见
此代码适用于任何类型的变量,无论它是全局变量还是局部变量,因为对象是通过引用传递的。
然而,更好的接口是当函数 returns 它作为参数获得的指针时。
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 ) );
在多线程环境下调用函数时存在差异,全局变量没有存储 class 说明符 _Thread_local。