将参数传递给函数,该函数将自动转换为指针

Passing an argument to a function that gets automatically converted to a pointer

本文关键字:函数 转换 指针 参数传递      更新时间:2023-10-16

注意:我使用的是g++编译器(我听说它非常好,应该非常接近标准(。


所以,我想我已经了解到,将指针传递给一个数组,或者将实际数组作为参数传递给另一个函数,总是会导致将指针传递到该数组。

类似地,我想我已经了解到,传递一个指针对函数或将实际函数作为参数传递给另一个函数总是会导致传递指向该函数的指针。

是否可以传递数组的副本(而无需在被调用函数内显式生成数组的副本(?

是否可以传递函数的副本(而无需在被调用函数内显式生成函数的副本(?这有用吗?这到底意味着什么?

我理解传递数组和它的副本之间的区别;传递函数和传递其副本有什么区别?

C不允许按值传递数组,也不允许更普遍地复制数组(除非手动(。C++继承了这一点,所以不,这是不可能的。更好的方法是使用std::array(对于C++0x;boost::array是相同的,并且可用于C++03(,这是一种可复制的类型,可以通过值传递。

int i[] = { 1, 2, 3 }; // type is int[3]
int j[3] = i; // error: can't copy an array
// C style would be to let j unitialized and to copy the values of
// i individually:
// int j[3]; std::copy(i, i + 3, j);
std::array<int, 3> ii = {{ 1, 2, 3 }};
std::array<int, 3> jj = ii; // Okay

在这两种语言中都不可能复制函数,与数组不同的是,也不可能"手动"复制复制函数"在这些语言中没有意义。


是否可以传递函数的副本(无需显式在被调用函数内复制函数(?是吗有用吗?这到底意味着什么?

"复制函数"在哪种语言中有意义?

Lua允许读取函数的字节码,并且可以在以后的某个点(或者在另一个解释器中(重用它来重构函数。我还假设,在适当的情况下,Lisp可以用它的代码即数据方法做同样的事情。请注意,在这两种语言中,这样做并不常见,也不习惯称之为"复制函数"。

int i = j;的意义上讲,这类事情是较少的复制——i是一个副本,但通常更接近编组/序列化的概念。也就是说,将运行时数据*转换为可以存储和/或传输(例如,通过网络(的更持久的形式。

*:在这些语言中(以及其他语言中(,与C和C++不同,函数是数据。

(1( 是否可以传递数组的副本(无需显式生成被调用函数内数组的副本(?

在C++中,您可以通过引用传递:

int a[100];
foo(a);

现在foo()将是

void foo (int (&arr)[100])
{
}

因此,在这里您不制作a的副本,但您仍然可以在foo()内部使用它,使用与在外部使用它相同的规则。

编辑:如果您想按值传递数组而不进行显式复制,那么您可以考虑将其放入struct包装中并传递:

struct Array { int a[100]; } myArr;
foo(myArr);
void foo(Array myArr);

(2( 是否可以传递函数的副本(无需显式在被调用函数内复制函数(?是吗有用吗?这到底意味着什么?

同样的事情,你可以通过引用传递。就其有用性而言,在大多数情况下,它可以像函数指针一样有用。但这在C++中并不常见。

void foo (int i) {}
typedef void (pf)(int);
void pass (pf &ptr)
{
  ptr(0);
}
int main ()
{
  pass(foo);
}

编辑:如果您想制作如上所述的副本,那么在函数的情况下是不可能的。因为它没有用。