我偶然发现了这个密码。
typedef __mpz_struct MP_INT;
typedef __mpz_struct mpz_t[1];在这里,struct __mpz_struct是一个结构,它被类型为单个元素的数组。我知道在C中这是一个通过引用传递的技巧,然后将mpz_t作为一种类型来声明变量并将它们传递给函数作为参数。另外,还有一条评论
/*
MP_INT*, MP_RAT* and MP_FLOAT* are used because they don't have side-effects
of single-element arrays mp*_t
*/他们说的是什么副作用?
发布于 2015-05-27 10:21:53
将数组传递给函数,让数组衰减到指向它的第一个元素的指针。
通过将地址运算符&应用于与数组元素类型相同的简单变量,可以达到同样的效果。
示例:
struct S
{
int i;
float f;
};这
void set_S(struct S * ps)
{
ps->i = 40;
ps->f = 2.;
}等于
void set_S(struct S ps[1])
{
ps->i = 40;
ps->f = 2.;
}等于
void set_S(struct S * ps)
{
ps[0].i = 40;
ps[0].f = 2.;
}等于
void set_S(struct S ps[1])
{
ps[0].i = 40;
ps[0].f = 2.;
}单元素阵列方法:
typedef struct S Array_of_S_with_size_1[1];
int main(void)
{
Array_of_S_with_size_1 array_of_S_with_size_1;
array_of_S_with_size_1[0].i = 0;
array_of_S_with_size_1[0].f = 0.;
set_S(array_of_S_with_size_1);
...
}上面的main()提供了如下相同的功能:
int main(void)
{
struct S s;
s.i = 0;
s.f = 0.;
set_S(&s);
...
}我看不出使用“单元素阵列”方法有什么好处。例如,如果键盘上的&-key被打破了. ;-)
发布于 2015-05-27 10:17:37
我看到了你问题的两部分。第一部分是如何将参数传递给函数,最好用一个例子来说明。如果没有它,我得猜一猜。
在C函数声明中,数组参数等效于指针。。这就是为什么您看到(例如)主函数的等价性,
int main(int argc, char **argv)和
int main(int argc, char *argv[])类似地,如果程序中的函数将被声明
int func(__mpz_struct *arg)它相当于
int func(__mpz_struct arg[])因此,到
int func(mpz_t arg)此外,在调用端,如果您有一个类型为mpz_t的变量,因此是数组,并将其传递给一个函数,"指针衰减“将生效:在表达式中,如果使用(数组的名称),它将”衰减“为指向其第一个元素的指针。这样您就可以调用该函数:
mpz_t value;
func(value);当然,要在API函数之外修改这些mpz_t对象,您仍然必须了解它们的真实性质。
你提到的副作用,我也得猜测一下。这可能意味着您必须意识到您正在处理函数中的指针。最好使用指针语法将其显式化。
发布于 2017-03-20 11:14:49
您可以将一个MP_INT分配给另一个,但是不能将一个mpz_t分配给另一个,因为没有为数组定义赋值。如果您不希望您的客户端分配变量,而不是通过您的方法(可能会执行内存管理等),那么这是您的诀窍。
https://stackoverflow.com/questions/30479106
复制相似问题