我是C的超级初学者,我想知道这些变量是否正确传递,我希望他们的值可以在main中改变。我主要想知道我是否正在使用&和*正确。
#include <stdio.h>
int assign(int *i, int *scores[]);
int main(void){
int scores[30], i;
assign(&i, &scores[0]);
return 0;
}
int assign(int *i, int *scores[]){
printf("Input scores:\n");
for (i = 0; i < 30; i++){
scanf("%d", *scores[*i]);
}
}
答案 0 :(得分:3)
你传递的间接层次太多了:
#include <stdio.h>
void assign(int *scores);
int main() {
int scores[30];
assign(scores);
return 0;
}
void assign(int *scores) {
int i;
printf("Input scores:\n");
for (i = 0; i < 30; i++) {
scanf("%d", &scores[i]);
}
}
答案 1 :(得分:1)
&amp;得分的类型为char[30]*
。分配需要char**
。为什么还要添加额外的间接?
使用:
int assign(int *i, int scores[static 30]);
致电:
assign(&i, scores);
理由:
C总是按值传递,因此使用指针是正确的
但是C不能复制数组,而是几乎每次使用它们都会衰减到指向第一个元素的指针
此外,如果原型似乎期望一个数组,它实际上需要一个指针
添加的static 30
是编译器的保证(并且是读者/程序员的标记,使用上述指针可以访问至少30
个元素。
另外,不要忘记适当地减少参考次数。目前你没有。
答案 2 :(得分:1)
您可以使用*
和&
来简化代码。此外,您可以直接将数组作为指针传递。无需&scores[0]
。
#include <stdio.h>
int assign(int i, int* scores){
printf("Input scores:\n");
for (i = 0; i < 30; i++){
scanf("%d", &scores[i]);
}
}
int main(void){
int scores[30], i;
assign(i, scores);
return 0;
}
答案 3 :(得分:1)
#include <stdio.h>
int assign(int *i, int scores[]);
int main(void){
int scores[30], i, j;
assign(&i, scores);
for(j=0;j<i;++j)
printf("%d %d\n", j, scores[j]);
return 0;
}
int assign(int *outSize, int scores[]){
int i = 0;
printf("Input scores:\n");
for (i = 0; i < 30; ++i){
if(1!=scanf("%d", &scores[i]))
break;
}
return *outSize = i;
}
答案 4 :(得分:0)
您也应该将数组的大小传递给函数。 C类型数组不知道它的大小。我们应该尽可能避免使用魔法/硬编码值。
//main function
int scores[30], i;
int size = sizeof(scores)/sizeof(scores[0]);
// pass the size information as well
int assign(int *i, int *scores[]), int size) {
}