我是C的新手,我正在寻找将数组传递给函数并访问元素的方法。
我发现有3种方法可以做到这一点。
我不明白的是,使用方法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%
答案 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);
让读者猜测。
同样,编译器将它们视为相同,但人类读者可以从一种形式获得更多信息。