0

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

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

  1. 传入一个数组,函数将参数指定为数组的类型
  2. 传入一个数组,函数将参数指定为指针类型
  3. 传入第一个元素的地址(其实这个地址就等于数组地址,我觉得和方法2一样)

我不明白的是,使用方法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%   
4

2 回答 2

2

这一行:

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

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

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

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

进一步阅读:

于 2013-06-13T18:53:04.830 回答
2

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

那是

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]);

清楚地表明参数应该是 3 维向量,而

void crossProduct(double *result, double *v1, double *v2);

让读者猜测。

同样,编译器将这些视为相同,但人类读者可以从一种形式中获得比另一种形式更多的信息。

于 2013-06-13T19:05:43.737 回答