- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
大家好,我是 C 的新手,正在学习指针。我正在编写一个简单的递归函数来测试它接受参数 int *a
和 int size
的地方。在我的 main 方法中,我预先使用 &
向 print_array
发送了数组第一个字符的地址。
这似乎不起作用,我在编译时收到“不兼容的指针类型”错误。我知道我可以删除 & 并且程序运行正常。我有一个问题:
为什么我不能用&从main中传入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(my_array, 20);
...或者:
print_array(&my_array[0], 20);
不幸的是,虽然 &my_array
是合法的代码,但它产生一个指向整个数组的指针,而不是指向数组第一个元素的指针。它们具有相同的地址,但类型不同,这就是导致错误的原因。
指针的类型决定了(除其他事项外)该指针的算术运算方式。在您的情况下,print_array
打印数组中的第一个 int,然后将一个添加到指针。因为它是指向 int 的指针,所以该添加实际上将 int 的大小添加到指针中的地址。
如果您使用了指向整个数组的指针,那么加一会将整个数组的大小添加到地址中。例如,我们假设 4 字节整数并且 my_array 的基地址为 1000。在这种情况下,my_array+1
将产生 1004,因此它保存数组中第二个整数的地址(正如你无疑想要的那样)。相比之下,&my_array
将获取整个数组的地址,类型为“指向 20 个整数的数组的指针”。当你向它添加 1 时,会将 1 * 指向类型的大小添加到地址,因此你将得到 1080
(即,整个数组为 20 * 4 = 80 字节).这显然不是您想要的 - 而不是 x+1
指向数组 中的第二个项目,它现在指向末尾数组,并尝试取消引用指针将产生未定义的行为。
因此,只需切换到上述形式之一(my_array
或 &my_array[0]
)。作为更一般的一点,要意识到在大多数情况下,数组名称的计算结果是指向数组第一个元素的指针——值得注意的异常(exception)是当您将数组名称用作 sizeof
运算符或地址运算符(就像您在此处所做的那样)。在这两种情况下,数组的名称仍然引用整个数组而不是指向第一个元素的指针。
关于c++ - 为什么我不必给函数数组的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28641436/
我是一名优秀的程序员,十分优秀!