我是否正确地传递了这些变量?C编程



我是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) {
}

最新更新