C 何时将指针参数传递给函数
我对此有点困惑。我的教授告诉我,当你想改变某件事时,你会传递一个指针。我用C 何时将指针参数传递给函数,c,pointers,C,Pointers,我对此有点困惑。我的教授告诉我,当你想改变某件事时,你会传递一个指针。我用交换(&first\u number,&second\u number)的例子来理解它。也, 我知道对于返回最多两个整数的函数,我不需要指针,因为我可以发送两个整数的副本,函数可以轻松返回最大值。 但我对此感到困惑: void f(int a[], int *n) { a[3] = a[(*n)-1]; (*n)--; } 这很有效。我如何才能100%确定何时通过int*a[]或仅通过int a[
交换(&first\u number,&second\u number)
的例子来理解它。也,
我知道对于返回最多两个整数的函数,我不需要指针,因为我可以发送两个整数的副本,函数可以轻松返回最大值。
但我对此感到困惑:
void f(int a[], int *n)
{
a[3] = a[(*n)-1];
(*n)--;
}
这很有效。我如何才能100%确定何时通过int*a[]
或仅通过int a[]
我的教授告诉我,当你想改变某件事时,你会传递一个指针
这意味着,如果希望在调用函数中声明的变量中看到更改,则需要将指向该变量的指针传递给被调用函数,前提是被调用函数希望将指向变量的指针作为参数
当数组名作为参数传递给函数时,数组名将转换为指向其第一个元素的指针。当用作功能参数时,int a[]
和int*a
是等效的
void f(int a[], int *n)
相当于
void f(int *a, int *n)
因此,当用作函数的形式参数时,不需要使用
int*a[]
,int a[]
和int*a
是等效的
下面是一个示例-在GCC4.8上干净地编译
void foo(int *a) {
}
void bar(int a[]) {
}
int main(int argc, char *argv[]){
int value;
int array[2] = {1,2};
foo(&value);
foo(array);
bar(&value);
bar(array);
}
例如:
何处为
int a[]- array of integers
also can be said as pointer to an array
例如:
因此,当您要将数组传递给函数时,请使用int*var或intvar[]
当您要传递包含指针变量作为元素的数组时,请使用int*var[]在函数调用中传递参数有两种方法:
inta[]
将指向内存中的数组。按值传递意味着您传递的变量的值被复制到方法中的局部变量。更改该局部变量对源变量没有影响。如果通过引用传递它(int n),则可以更改源变量。
传递int*a[]
将是对指向int的指针数组的引用,这在您的示例中是不需要的
但是,您可以使用
int*a
而不是int a[]
来指向数组的第一个元素。在不知道数组长度的情况下直接使用[3]是危险的,如果数组小于4 int,可能会产生分段错误。避免这种行为的最佳方法是,它是在函数的参数中传递数组的长度。int a[]
是int
的数组,int*a[]
是int*
的数组。这就是区别。符号[]
与C类型系统中的*
基本相同。因此,如果你说你在向函数传递数组,你也可以说你在传递指针。我不理解你的困惑(第一段中的解释听起来好像你已经理解了这个概念)。也许你可以详细说明你希望如何编写f
?而这个int*a[]
从何而来呢?在参数声明中——而且只有在参数声明中——int*a[]
真正的意思是int*a
。在任何其他上下文中,数组和指针绝对不是一回事。在大多数上下文中,数组表达式都转换为指针。《条例》第6条解释了这一点;如果你真的不理解一个问题,那么不要对答案投反对票。为什么第三个答案重复OP已经理解的部分?@mafso;在哪里重复?是的,对不起,没有重复。也许真的是指针衰减数组不明白。但是,int*a[]
将是一个打字错误,应该在之前加以澄清(如果这是混淆,找到一个重复的就可以了)。@mafso;发现重复是另一个问题,不应该与否决票有关。当问题明确时,可以找到重复,这确实与这里的投票无关。如果你的回答恰好回答了澄清的问题,我很乐意收回我的投票。是的,但没有回答问题。
int *arr[2];
int a=10,b=20;
int *ptr1=&a;
int *ptr2=&b;
arr[0]=ptr1;
arr[1]=ptr2;
printf("%d",*arr[0]);--->10
printf("%d",*arr[1]);--->20
int a[]- array of integers
also can be said as pointer to an array
int arr[]={10,20};
printf("%d",*arr)--->10