2012-11-08 44 views
1

如果我传递一个int值,它将被传递。
void something(int i)
如果我通过一些类型的阵列,将通过引用传递的。
void something(int i[])
OR void something(int *i);哪些类型按引用传递,哪些类型按值传递?

类型如int将由值传递,阵列将作为引用传递。

第一个问题是,还有更多的类型会通过引用传递吗?
第二个问题是,数组(int i[])的第一次通过与第二次(int *i)的第一次通过有什么区别?

编辑: 我会澄清我的问题。 您传递给函数的其他类型(如数组)在函数内部可以更改。 (正如你所解释的那样,它并不完全按照引用传递)。

void something(int i[]) 
{ 
i[0]=5; 
} 

something(i); 

这将改变阵列不仅在本地。

结构怎么样?工会?指向他们的指针也传递了?

回答

2

一切都按价值,周期传递。

所不同的是用C如何处理阵列表达式。除了它是sizeof,或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字之外,“N-element array of T”的表达式将被转换(“衰减“)转换为类型为”指向T的指针“的表达式,表达式的值将是数组的第一个元素的地址。

所以赋予相同

int a[10] = {0}; 

声明每当表达a在代码的任何地方出现以外&asizeof a,或者_Alignof a,它会被转换为指针的表达和表达的值将是无论表达式是否传递给函数,地址为a[0]

因此,在一个函数调用等

foo(a); 

表达a转换为指针表达式,并且指针表达(&a[0])的值被传递给函数。

同样,在函数参数声明中,T a[]T a[N]被解释为T *a;无论数组表示法如何,该参数都被声明为指针,而不是数组。

0

所有类型通过值,但该值(在函数调用上下文)的阵列的名字是第一个元素的地址。

+0

谢谢你的回答,我澄清了我的问题。 – Lior

4

所有类型的传递由C.数组值实际上并不在功能上获得通过调用 - 当你声明数组参数,编译器默默替换数组的指针,当你调用它,你通过数组第一个元素的地址。

指针也通过值传递。只是当你复制一个指针时,你仍然可以修改指向的值,所以它与(通过引用)非常相似(但不完全相同)。用C

+0

谢谢你的回答,我澄清了我的问题。 – Lior

2

一切是按值传递。数组不是通过引用传递的,而是会衰减为一个指针,与所有其他指针一样,这个指针是按值传递的。

通过传递值的指针意味着它保存地址被复制,并且在函数内给您的副本,它指向相同的数据外指针操作。试图改变指针本身的函数内的值,但不会影响调用者已通过指针:

void fn (int *ptr) 
{ 
    // this is OK and the data that the pointer points to will be updated, 
    // even though the pointer itself is a copy 
    *ptr = 5; 

    // this will not have an effect out of the function since ptr is merely a copy 
    ptr = NULL; 
} 

在上面的例子,如果你要改变的ptr的价值,你会必须声明函数为具有int **参数,而不是int *

void fn (int **ptr) 
{ 
    *ptr = NULL; 
} 
... 
int *x; 
// at this point, x is uninitialised 
fn(&x); 
// x is now NULL 
+0

谢谢你的回答,我澄清了我的问题。 – Lior

0

任何数据类型你能想到的(即使你枚举的那些)既可以作为参考或作为值传递。

+0

谢谢你的回答,我澄清了我的问题。 – Lior