我知道
function(int *a); function(int a[]);
在C中也是一样,function(int a[])会被翻译成function(int *a)
int *a = malloc(20);
int b[] = {1,2,3,4,5};
这两个不一样,第一个是指针,第二个是数组。当我调用 function(b)?(function(int *a)) 时会发生什么 我知道 b 在堆栈上,那么如何传递给该函数?
其次,字符串:
char *c1 = "string";
char c2 [] = "string";
在这种情况下,我不知道 c1 在哪里,我想 c2 在堆栈上。 假设现在的函数是:function(char *c),它和 function(char c[]) 一样,当我调用 function(c1) 和 function(c2) 时会发生什么,字符串将通过引用传递或值(value)?
最佳答案
这里有一个关键点,所有东西都是按值传递的,例如,这会将a
的副本传递给foo()
(恰好是指向某个内存的指针):
int *a = malloc(20);
foo(a);
这就是为什么如果你在 foo()
中做这样的事情,它并没有真正改变 main()
中的指针 a
但更改本地副本:
foo(int *a)
{
a = NULL; /*changes local copy of the pointer*/
}
换句话说,您可以使用 foo()
的 a
的本地副本来更改“a”指向的内存但不要更改 main()
中的 a
指向。
现在,要“通过引用”传递某些内容,您需要将指针到指针的副本传递给函数(类似于 a->b->memory):
int *a = malloc(20);
foo(&a);
因此,当您在 foo()
中分配给它以更改 main()
中的指针时:
foo(int **a)
{
*a = NULL; /*changes the pointer in main */
}
现在回答您的一些其他问题,当您使用数组名称 时,它被转换为指向数组第一个元素的指针:
int *a = malloc(20);
int b[] = {1,2,3,4,5};
foo(a);
foo(b);
最后两个函数调用是等价的,它们都传递了一个指向某个内存的第一个元素的指针,不同的是a
的内存分配在堆上,的内存>b
但是,分配在堆栈上。
最后,字符串,以下是相似的,因为同样的原则适用,但是第一个是常量字符串文字并且应该被定义为const
并且你不应尝试在任何地方修改它,但您可以更改第二个:
const char *c1 = "string";
char c2 [] = "string";
关于c - 数组是按值传递还是按引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13449306/