何时将指针参数传递给函数

时间:2014-09-24 15:02:04

标签: c pointers

我对此有点困惑。我的教授告诉我,当你想要某些东西改变时,你会传递一个指针。我用swap(&first_number, &second_number)的例子来理解它。也, 我知道我不需要一个返回最多两个整数的函数的指针,因为我可以发送两个整数的副本,函数可以很容易地返回最大值。 但我对此感到困惑:

void f(int a[], int *n)
{
    a[3] = a[(*n)-1];
    (*n)--;
}    

这很有效。如何才能100%确定何时通过int *a[]int a[]

5 个答案:

答案 0 :(得分:1)

当用作函数的形式参数时,int a[]int *a是等效的。

这是一个例子 - 在gcc 4.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);


}

答案 1 :(得分:0)

  

我的教授告诉我,当你想要改变什么时,你会传递一个指针。

这意味着如果要在调用函数中声明的变量中看到更改,则需要将指向该变量的指针传递给被调用函数,前提是被调用函数需要将变量指针作为参数。

当数组名作为参数传递给函数时,数组名转换为指向其第一个元素的指针。如果用作函数参数int a[]int *a是等效的。

void f(int a[], int *n)  

相当于

void f(int *a, int *n)  

因此,您不需要int *a[]

答案 2 :(得分:0)

int * a[] - means array of pointers  
          - so each index will store pointer type variable

例如:

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

所以当你想把数组传递给函数时,使用int * var 或int var []   当你想传递具有指针变量作为元素的数组时,请使用int * var []

答案 3 :(得分:0)

在函数调用中传递参数的方法有两种:

  1. 按值,只能用于原始类型,如int,byte,char等。
  2. 通过引用,您实际上将该位置传递给内存。
  3. 最后一个自动用于非基本类型(例如数组),因此不需要'';值在内存中,您提供对此内存块的引用。 因此int a[]将指向内存中的数组。按值传递意味着您传递的变量的值将复制到方法中的局部变量。更改该局部变量对源变量没有影响。如果通过引用传递它(int n),则可以更改源变量。 传递int* a[]将是对int的指针数组的引用,在你的情况下你不需要它。

    但是,您可以使用int* a代替int a[]来指向数组的第一个元素。

答案 4 :(得分:0)

在不知道数组长度的情况下直接使用[3]会很危险,如果数组小于4 int,则会产生分段错误。避免这种行为的最佳方法是,在函数的参数中传递数组的长度。

相关问题