#include <stdio.h>
#include <stdlib.h>
void fun(int *arr)
{
arr=(int *)malloc(2*sizeof(int));
arr[0]=5;
arr[1]=4;
printf("in fun {%d, %d}",arr[0],arr[1]);
}
void anotherFunction(int *arr)
{
arr[0]=4;
arr[1]=5;
printf("in fun {%d, %d}",arr[0],arr[1]);
}
int main(void)
{
int *arr,*emptyInMain;
int arr2[]={99,99};
arr=(int *)malloc(2*sizeof(int));
arr[0]=99;
arr[1]=99;
printf("arr ");
fun(arr);
printf("narr in main {%d, %d}n",arr[0],arr[1]);
printf("emptyInMain");
fun(emptyInMain);
//printf("narr in main {%d, %d}n",emptyInMain[0],emptyInMain[1]); // WILL GIVE RUNTIME ERROR
printf("n--commented the line in the code because emptyInMain[0],emptyInMain[1] will give RUNTIME ERROR--");
printf("narr2");
fun(arr2);
printf("narr2 in main {%d, %d}n",arr2[0],arr2[1]);
printf("nfollowing output shows expected behaviourn");
printf("narr2");
anotherFunction(arr2);
printf("narr2 in main {%d, %d}n",arr2[0],arr2[1]);
return 0;
}
我们都知道,将数组作为参数传递是通过引用进行的调用。就好像我把一个数组arr={99,99}发送给一个使arr[0]=4和arr[1]=5的函数一样,调用函数中的值也变为4和5。如果我发送了变量的地址,并且在其他函数中进行了一些操作,那么这也应该适用。
上面代码的以下输出让我感到困惑。我想确定我的想法是否正确。
arr in fun {5, 4}
arr in main {99, 99}
emptyInMainin fun {5, 4}
--commented the line in the code because emptyInMain[0],emptyInMain[1] will give RUNTIME ERROR--
arr2in fun {5, 4}
arr2 in main {99, 99}
following output shows expected behaviour
arr2in fun {4, 5}
arr2 in main {4, 5}
只有最后一个输出显示了更改。
为什么我认为arr在前三种情况下没有改变,是因为我们正在发送arr的地址,该地址存储在fun()的局部变量中。这个局部变量开始指向语句之后的其他地址:
arr=(int *)malloc(2*sizeof(int));
anotherFunction()是唯一一个不改变其本地变量分配并操纵存储在其(本地变量)地址中的值的函数。
如果我的以下假设是错误的,请告诉我。此外,请让我知道在所有情况下,我可以做出什么样的最佳更改来更改数组中的值。我该怎么做才能通过被调用函数内的malloc使变量指向位置(我猜是双指针,但不确定)。
要回答标题中的问题,C参数总是按值传递,而不是按引用传递。数组的不同之处在于,当您将数组作为参数传递时,它会自动转换为指向数组第一个元素的指针,这就是传递的值。所有其他类型的参数都是通过复制值来传递的。
在任何一种情况下,为函数中的参数变量赋值都不会对调用方的变量产生影响。当参数是指针时,您可以间接通过它来访问调用方的数据。如果它是指向数组元素的指针,则可以对其进行索引以访问调用方的数组。这就是anotherfunction()
函数中发生的情况。
如果你想在函数中分配数组,并让它影响调用者,有两种方法可以做到
首先是让函数返回指针:
int *fun() {
int *localarr = malloc(2 * sizeof(int));
localarr[0] = 4;
localarr[1] = 5;
return localarr;
}
然后打电话的人会做:
arr = fun();
第二种方法是将指针传递给指针。
void fun(int **arrparam) {
int *localarr = malloc(2 * sizeof(int));
localarr[0] = 4;
localarr[1] = 5;
*arrparam = localarr;
}
然后呼叫方执行:
fun(&arr);
我该怎么做才能通过被调用函数内部的malloc使变量指向位置,从而使main中的变量也开始指向新位置(我猜是双指针,但不确定)。
为了做到这一点,您必须将一个指针传递给一个指针(即双指针)。
foo(int** ptr)
{
*ptr = malloc(sizeof(int)*2);
(*ptr)[0] = 10;
(*ptr)[1] = 20;
}
int main()
{
int* ptr;
foo(&ptr); // Use the & operator to pass a pointer to the pointer.
// Check to make sure that the values are as expected.
assert(ptr[0] == 10);
assert(ptr[1] == 20);
// deallocate the memory
free(ptr);
}