可能在C中做这样的事情吗?
typedef XXX bar;
void foo(bar i) {
...
}
main() {
bar a;
foo(a); // note!!, this is not foo(&a)
// a is now initialized
}
请注意,foo
是一个void
函数,否则返回一个新栏可以轻松解决问题。此外,即使bar是一个指针,或指针的指针,例如typedef int ** bar
,我也不知道foo
如何初始化a
我提出了自己的问题,因为我相信GMP他们做了类似的事情。所以在GMP中你可以拥有:
mpz_t a;
mpz_init2(a);
// a is now initialized
答案 0 :(得分:3)
来自http://gnu.huihoo.org/gmp-3.1.1/html_chapter/gmp_4.html:
mpz_t实际上是作为某个元素的单元素数组实现的 结构类型。这就是使用它来声明一个变量的原因 具有GMP需要的字段的对象,但随后将其用作参数 传递指向对象的指针。
答案 1 :(得分:2)
可以使用函数中的指针参数和参数列表中的address-of运算符在C中实现引用语义:
void init(int * dst, int value) { *dst = value; }
// ^^^^^^
// function takes parameter by address, passed as a pointer
int main()
{
int a;
init(&a, 10);
// ^^
// caller passes address-of object
}
如果您想要一个词法上省略了address-of运算符的语法,您可以将该部分粘贴到宏中:
#define INIT_BY_REF(x, val) init_ref(&(x), val)
现在使用:init_ref(a, 10)
答案 2 :(得分:0)
只有初始化的变量是指针或(typedef
'd)数组才有可能。我没有GMP经验,但初始化函数向我表明mpz_t
是指针或数组的typedef。
如果传递的参数是原始值或结构值,则该函数将使用其自己的数据副本,并保持传递给它的变量不受影响。