C语言 在 C99 中的函数之间共享变量


  1. 从主matrix_1中获取输入,我需要创建一个新的并仅用奇数打印它。现在我从函数打印它,但我需要从main()打印它;我该怎么做?
#include <stdio.h>
#define len 4
void copiaDispari();
int main () {
int i, j, matrix_1[len][len];
for (i=0; i < len; i++){
for (j=0; j < len; j++) {
printf ("Inserisci il numero della matrice %d %d:", i, j);
scanf ("%d", &matrix_1[i][j]);
}
}
copiaDispari(matrix_1);
for (i=0; i < len; i++){
for (j=0; j < len; j++) {
printf ("%d", matrix_2[i][j]);
}
printf("n");
}
return 0;
}
void copiaDispari(int matrix_1[len][len]) {
int matrix_2[len][len]= {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}, i, j, l=0, m=0;

for (i=0; i < len; i++){
for (j=0; j < len; j++){
if (matrix_1[i][j]%2!=0){
if (l==4) {
l=0; m++;
}
matrix_2[m][l] = matrix_1[i][j];
l++;
}
}
}
for (i=0; i < len; i++){
for (j=0; j < len; j++) {
printf ("%d", matrix_2[i][j]);
}
printf("n");
}
return;
}
    想象一下,我
  1. 必须将 5 或 6 个变量从一个函数void yeah()传递到另一个函数void yessss();我怎样才能实现它?
  2. 我什么时候应该使用 void 函数,什么时候应该使用 int 函数?
  1. [改写] 如何将数据发送回调用函数?

基本上你有两个选择

创建对象以在调用函数中保存数据,传递指针并让被调用函数使用该指针

int main(void) {
int src1[10][10] = {0};
int src2[10][10] = {0};
fx(src1, src2);
}

或者在被调用的函数中使用malloc()(和朋友(,然后将其返回给负责free资源的调用方。

typedef int m2[10][10];
int main(void) {
int src[10][10] = {0};
m2 *dst = fx(src);
// use dst
free(dst);
}
m2 *fx(int m[10][10]) {
m2 *x = malloc(10 * 10 * sizeof (int));
// work with m to change x values
return x;
}

第三个选项,不受欢迎(没有示例代码(,是使用全局变量。

  1. 如何在函数之间传递 5 或 6 个变量?

基本上,只需在调用代码中指定它们,例如

printf("%s bought %d %s for %.2fn", name, quantity, "apples", quantity * price);

或者,如果变量相关,则可以尝试将它们分组到struct中并传递指针

struct GroupData {
char name[100];
int quantity;
char item[100];
double price;
};
struct GroupData x = {"John", 42, "apple", 0.31};
workwithdata(&x); // can also pass a copy of the struct
// workwithcopy(x);
  1. 何时使用 void 函数或 int 函数?

当不需要使用函数中的值时,请使用void

void beep(void); // sounds the bell

如果要使用函数中的值,请使用int

int currenttemp(void); // returns the temperature
最简单的
  1. 方法是在main()中分配第二个数组,并将其作为参数传递给函数(以及第一个数组(。

    int i, j, matrix_1[len][len], matrix_2[len][len] = { { 0 } };
    …
    copiaDispari(matrix_1, matrix_2);
    …
    void copiaDispari(int matrix_1[len][len], matrix_2[len][len])
    {
    …
    }
    

    其他技术使用动态内存管理(malloc()等(,或者将数组封装在结构中并传递结构类型(您可以返回包含数组的结构;您不能从函数返回数组(,或者(有时,但不经常(在函数中使用static数组并返回指向它的指针(不要这样做(, 或使用全局变量(也不要这样做!

  2. 函数可以具有半无限量的大量参数。 C11 §5.2.4.1 转换限制要求编译器接受至少具有 127 个参数的函数定义和调用。 仅仅 5 或 6 不会让编译器感到任何焦虑。 但是,减少参数的数量是个好主意。

    如果要从函数返回多个值,可以将多个指针传递给函数,并让它通过指针修改变量。 或者,可以将变量集包装到结构中,并将指针传递给合适的结构,也可以将合适的结构返回给调用函数。

  3. 当函数生成将由调用代码使用的值时,通常不应使用void函数。 您可以将指针传递给变量,该函数可能会修改这些指针以返回其答案。 如果函数可能失败,则可以让它在成功时返回 0,在失败时返回一些其他值;当然,这排除了它具有返回类型void。 错误处理是 C 编程的主要部分。 如果函数不返回指示成功或失败的值,则很难知道是否存在问题。


顺便说一下,函数的前向声明不应是:

void copiaDispari();

在您的原始代码中,它应该是:

void copiaDispari(int m1[len][len]);

在修订后的代码中,它应该是;

void copiaDispari(int m1[len][len], int m2[len][len]);

这将有助于防止错误,例如使用错误数量的参数调用函数。

切勿为参数列表编写带有()的函数声明。 也就是说该函数接受不确定数量的参数(但它不是像printf()那样的变量参数列表函数(。 如果函数不带参数,请在声明中编写int function(void);,为了保持一致性,int function(void) { … }在定义中编写。 尽管可以在定义中编写int function() { … },但这不会为函数提供原型,并且可能会在同一源文件中错误调用它。 请注意,C++在这方面与 C 不同。 旧的 C 代码(在 C89/C90 标准产生之前(使用()表示法;它别无选择。 本千年编写的代码不应使用()符号。

最新更新