你好,我刚开始学习C语言,正在学习指针。我正在编写一个简单的递归函数进行测试,它有两个参数:int *a
和 int size
。在我的主函数中,我使用 &
将我的数组第一个字符的地址传递给 print_array
函数。
然而这样似乎行不通,在编译时出现了“不兼容的指针类型”错误。我知道可以去掉 &,程序就能正常工作。我有一个问题:
为什么我不能用 & 从主函数把 my_array 的内存地址传递进去呢?我不应该只需要给函数数组的第一个元素的内存地址就行了吗?
谢谢,希望我的问题不太幼稚。
#include <stdio.h>
#include <stdlib.h>
void print_array(int *a, int size){
if (size>0){
printf("%d\n", a[0]);
print_array(a+1, size-1);
}
}
int main(void){
int my_array[20];
int i;
for (i=0; i < 20; i++){
my_array[i] = rand() % 20;
}
/*the contents of the array*/
printf("The contents of the array\n");
for (i=0; i < 20; i++){
printf("%d\n", my_array[i]);
}
printf("The recursive method print\n");
print_array(&my_array, 20);
return EXIT_SUCCESS;
}
print_array
的第一个参数声明为int (*a)[20]
,那么你可以将&my_array
传递给它。但是,int *a
是指向整数的指针,而不是指向包含20个整数的数组的指针。这就是为什么你必须传递数组的第一个元素的地址,而不是数组本身的地址(即使它们具有相同的数值)。 - Wyzardint (*a)[20]
,你可以传递&my_array
,但是在print_array
内部的a+1
将产生未定义的行为。 - Jerry Coffin&my_array
会给我一个指向整个数组的指针吗?如果它们都指向同一个块,它们怎么可能是不同的类型呢?谢谢。 - magna_nz