将数组作为数组和指针传递给函数

时间:2013-06-13 18:50:36

标签: c arrays function pointers parameters

我是C的新手,我正在寻找将数组传递给函数并访问元素的方法。

我发现有3种方法可以做到这一点。

  1. 传入一个数组,该函数将参数指定为 array
  2. 的类型
  3. 传入一个数组,该函数将参数指定为指针
  4. 的类型
  5. 传入第一个元素的地址(实际上这个地址等于数组地址,我认为这与方法2相同)
  6. 我不明白的是,使用方法1.传入的数组的地址与函数中数组参数的地址不同。使用方法1和方法2有什么不同。

    代码:

    #include <stdio.h>
    
    void pass_by_array(int x[]);
    void pass_by_pointer(int *x);
    int main(void){
        int i;
        int base[5] = {3, 7, 2, 4, 5};
        printf("address of first element in main %p\n", &base[0]);
        printf("address of array in main %p \n\n", &base);
        pass_by_array(base);
        pass_by_pointer(base);
    }
    
    /* Pass in the array as type of int x [] */
    void pass_by_array(int x[]){
        printf("address of first element passed in: %p \n", &x[0]);
        printf("address of array passed in: %p \n\n", &x);
    }
    
    /* Pass in the array as type of int pointer*/
    void pass_by_pointer(int *x){
        printf("passing in array by pointer, address: %p",x);
    }
    

    输出:

    address of first element in main 0xbfcea3ac
    address of array in main 0xbfcea3ac 
    
    address of first element passed in: 0xbfcea3ac 
    address of array passed in: 0xbfcea390 
    
    passing in array by pointer, address: 0xbfcea3ac%   
    

2 个答案:

答案 0 :(得分:2)

这一行:

printf("address of array passed in: %p \n\n", &x);

错了。您不是打印出数组的地址,而是打印存储数组指针的局部变量的地址。(是的,x实际上是一个指针。)只需打印出x:< / p>

printf("address of array passed in: %p \n\n", x);

答案是,在这种情况下,声明它的方式并不重要。 C中的int[]int*有时是可以互换的,这是它们所处的情况之一。

进一步阅读:

答案 1 :(得分:2)

虽然它们具有相同的编译器语义,但有时使用[]形式是有充分理由的。特别是当您期望的参数表示特定维度的数组(静态或在另一个传递的参数中指定)时,您可以使您的意图比使用*语法更清晰。 / p>

那是

int arraySum(int n, int ary[n]);

记录参数n的含义,而

int arraySum(int n, int *ary);

没有。

类似地

void crossProduct(double result[3], double v1[3], double v2[3]);

清楚地表明,在

时,参数应该是三维向量
void crossProduct(double *result, double *v1, double *v2);

让读者猜测。

同样,编译器将它们视为相同,但人类读者可以从一种形式获得更多信息。