C-将数组引用传递到函数中的指针参数时出错



我在传递一个整数数组作为引用,然后修改原始数组时遇到问题。

#include <stdio.h>
// sets the 2 element of i to 5
void setToFive(int *i[10]){
*i[2] = 5;
printf("hellon");
}
int main(){
int i[10];
setToFive(&i);
// confirm i[2] == 5
printf("%dn", i[2]);
}

编译器抱怨类型无效

[vinessa@komputilo ch1]$ gcc test.c
test.c: In function ‘setToFive’:
test.c:5:5: error: invalid type argument of unary ‘*’ (have ‘int’)
5 |     *i[2] = 5;
|     ^~~~~
test.c: In function ‘main’:
test.c:11:15: warning: passing argument 1 of ‘setToFive’ from incompatible pointer type [-Wincompatible-pointer-types]
11 |     setToFive(&i);
|               ^~
|               |
|               int (*)[10]
test.c:4:21: note: expected ‘int *’ but argument is of type ‘int (*)[10]’
4 | void setToFive(int *i){
|                ~~~~~^

分段故障

[vinessa@komputilo ch1]$ ./a.out
Segmentation fault (core dumped)

几个小时来我一直在努力解决这个问题,请帮帮我。

这是

#include <stdio.h>
// sets the 2 element of i to 5
void setToFive(int *i){
i[2] = 5;
printf("hellon");
}
int main(){
int i[10];
setToFive(i);
printf("%dn", i[2]);
}

如果您想更改数组的元素,那么只需按值传递即可。在这种情况下,数组指示符被隐式转换为指向其第一个元素的指针。使用指针和指针算术,您可以更改数组的任何元素。

事实上,在这种情况下,您通过指向数组元素的指针间接地通过引用传递数组元素。

注意这些函数声明

void setToFive(int i[100]);
void setToFive(int i[10]);
void setToFive(int i[1]);
void setToFive(int i[]);

是等效的,并声明相同的一个函数声明,编译器将其调整为以下声明

void setToFive(int *i);

这就是函数处理指针的结果。

至于在这个函数中用作参数的表达式,请调用

setToFive(&i);

则它具有类型CCD_ 1,因为定点阵列被声明为类似

int i[10];

它与我已经编写的参数int *i[10]的类型不同,编译器将其调整为类型int **

您正在将指针数组传递给整数,而不是整数数组。您只需删除各种*声明和运算符,然后只需传递一个简单的数组作为参数(数组参数将衰减为指针(:

#include <stdio.h>
// sets the 2 element of i to 5
void setToFive(int i[10])
{
i[2] = 5;
printf("hellon");
}
int main()
{
int i[10];
setToFive(i);
// confirm i[2] == 5
printf("%dn", i[2]);
return 0;
}

最新更新