将结构数组传递给 C 中的按值函数
Passing array of structures to function by value in C
我想将一个包含三个结构的数组传递给一个函数,该函数对存储在结构数组中的三个数字进行排序,但不想更改实际值 ,因为数组是通过引用传递的,这是我的问题,任何想法都接受谢谢:)
这是我的审查代码:
#include <stdio.h>
#define N 3
typedef struct
{
int digito;
} numbers;
void sort(numbers tabla[], int nro);
void enternums(numbers tabla[], int nro);
int main()
{
static numbers enter[N];
int i, j, tmp;
enternums(enter, N);
printf("Data before entering the function...\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", enter[i].digito);
}
sort(enter, N);
printf("After entering data function....\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", enter[i].digito);
}
return 0;
}
void enternums(numbers tabla[], int nro)
{
int i;
for (i = 0 ; i < nro ; i++)
{
printf("Enter a digit for the position %d: ", i);
scanf("%d", &tabla[i].digito);
}
}
void sort(numbers tabla[N], int nro)
{
int i, j, tmp;
for (i = 1 ; i < nro ; i++)
{
j = i;
tmp = tabla[i].digito;
while ((j > 0) && (tmp < tabla[j - 1].digito))
{
tabla[j].digito = tabla[j - 1].digito;
j--;
}
tabla[j].digito = tmp;
}
}
除非数组包含在 struct
中,否则不能按值传递数组。
您可以使用:
typedef struct MyStrutArray
{
numbers enter[N];
} MyStructArray;
然后使用:
void sort(MyStructArray array);
将数组作为指针1传递给它的第一个元素,优点是您实际上可以传递另一个数组来存储新值
void sort(const numbers *const tabla, numbers *resultado, int nro)
{
int i, j, tmp;
for (i = 1 ; i < nro ; i++)
resultado[i].digito = tabla[i].digito;
for (i = 1 ; i < nro ; i++)
{
tmp = resultado[i].digito;
for (j = i ; (j > 0) && (tmp < resultado[j - 1].digito) ; --j)
resultado[j].digito = resultado[j - 1].digito;
resultado[j].digito = tmp;
}
}
将 while
循环改为 for
循环,这会使您的代码更清晰。
并使用这个
int main()
{
static numbers enter[N];
static numbers ordenado[N];
int i, j, tmp;
enternums(enter, N);
printf("Data before entering the function...\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", enter[i].digito);
}
sort(enter, ordenado, N);
printf("After entering data function....\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", ordenado[i].digito);
}
return 0;
}
此外,通过检查可能的错误来使您的代码更安全,例如
scanf("%d", &tabla[i].digito);
应该是
if (scanf("%d", &tabla[i].digito) != 1)
Oops_there_is_a_problem_dont_use_this_value_maybe_ask_again();
1这是自动发生的,它不是通过引用传递而是转换为指针.
我想将一个包含三个结构的数组传递给一个函数,该函数对存储在结构数组中的三个数字进行排序,但不想更改实际值 ,因为数组是通过引用传递的,这是我的问题,任何想法都接受谢谢:)
这是我的审查代码:
#include <stdio.h>
#define N 3
typedef struct
{
int digito;
} numbers;
void sort(numbers tabla[], int nro);
void enternums(numbers tabla[], int nro);
int main()
{
static numbers enter[N];
int i, j, tmp;
enternums(enter, N);
printf("Data before entering the function...\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", enter[i].digito);
}
sort(enter, N);
printf("After entering data function....\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", enter[i].digito);
}
return 0;
}
void enternums(numbers tabla[], int nro)
{
int i;
for (i = 0 ; i < nro ; i++)
{
printf("Enter a digit for the position %d: ", i);
scanf("%d", &tabla[i].digito);
}
}
void sort(numbers tabla[N], int nro)
{
int i, j, tmp;
for (i = 1 ; i < nro ; i++)
{
j = i;
tmp = tabla[i].digito;
while ((j > 0) && (tmp < tabla[j - 1].digito))
{
tabla[j].digito = tabla[j - 1].digito;
j--;
}
tabla[j].digito = tmp;
}
}
除非数组包含在 struct
中,否则不能按值传递数组。
您可以使用:
typedef struct MyStrutArray
{
numbers enter[N];
} MyStructArray;
然后使用:
void sort(MyStructArray array);
将数组作为指针1传递给它的第一个元素,优点是您实际上可以传递另一个数组来存储新值
void sort(const numbers *const tabla, numbers *resultado, int nro)
{
int i, j, tmp;
for (i = 1 ; i < nro ; i++)
resultado[i].digito = tabla[i].digito;
for (i = 1 ; i < nro ; i++)
{
tmp = resultado[i].digito;
for (j = i ; (j > 0) && (tmp < resultado[j - 1].digito) ; --j)
resultado[j].digito = resultado[j - 1].digito;
resultado[j].digito = tmp;
}
}
将 while
循环改为 for
循环,这会使您的代码更清晰。
并使用这个
int main()
{
static numbers enter[N];
static numbers ordenado[N];
int i, j, tmp;
enternums(enter, N);
printf("Data before entering the function...\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", enter[i].digito);
}
sort(enter, ordenado, N);
printf("After entering data function....\n\n");
for (i = 0 ; i < N ; i++)
{
printf("%d\n", ordenado[i].digito);
}
return 0;
}
此外,通过检查可能的错误来使您的代码更安全,例如
scanf("%d", &tabla[i].digito);
应该是
if (scanf("%d", &tabla[i].digito) != 1)
Oops_there_is_a_problem_dont_use_this_value_maybe_ask_again();
1这是自动发生的,它不是通过引用传递而是转换为指针.