我是C语言的超级初学者,我想知道这些变量是否被正确传递,我希望它们的值在主要方面被更改。我主要想知道我是否在使用&和*正确。
#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]);
}
}
您传递了太多的间接级别:
#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]);
}
}
您可以用更少的*
和&
来简化代码。此外,您可以直接将数组作为指针传递。无需执行&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;
}
amp;分数具有类型CCD_ 4。Assign需要char**
。为什么还要添加额外的间接寻址?用途:
int assign(int *i, int scores[static 30]);
呼叫:
assign(&i, scores);
理由:
C总是通过值传递,所以使用指针是正确的
但是C不能复制数组,它们几乎每次使用都会衰减为指向第一个元素的指针
此外,如果原型看起来需要一个数组,那么它实际上需要一个指针
添加的static 30
是编译器的一个保证(也是读者/程序员的一个标记,即使用上述指针至少可以访问30
元素。
此外,不要忘记忽略适当的次数。目前你没有。
#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 %dn", 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;
}
您也应该将数组的大小传递给函数。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) {
}