c - 数组是按值传递还是按引用传递?

标签 c arrays string pointers

我知道

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/

相关文章:

c - 面试题: C program to sort a binary array in O(n)

c - 分析 u-Boot/内核启动顺序

javascript - 第二次单击时 jQuery 数组不会被删除

python - 使用带有稀疏 scipy 矩阵的广播

python - 如何加快一系列文件中存在的键的总和? - Pandas ,nltk

java - 在递归中查找Java字符串数组的无序序列

c - "inner"和 "outer"在此冒泡排序代码中如何工作?

c - 为什么即使在 C 中使用指针后数字也不会交换?

java - 错误: incompatible types when passing an array to another method

vb.net - 将字符从小写转换为大写,反之亦然 VB.Net