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[]

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

  • 按值,这仅适用于int、byte、char等基本类型
  • 通过引用,实际上通过引用传递内存中的位置
  • 最后一个自动用于非基本类型(如数组),因此不需要“”;该值在内存中,您可以提供对该内存块的引用。 因此,
    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