#c #function #struct
#c
Вопрос:
Привет, друзья, я практикую структуры. У меня есть эти две функции, одна из которых возвращает структуру, и я копирую ее в локальную структуру в main. Моя вторая функция изменяет эти локальные элементы структуры, вводя разные объекты. Теперь я напечатал результат после вызова каждой функции, к моему удивлению, я заметил, что напечатанный результат после того, как обе функции одинаковы. Я не могу понять, что здесь происходит … не могли бы вы, ребята, объяснить мне … спасибо!
#include <stdio.h>
#include <stdlib.h>
struct student{
char name[30];
float marks;
};
struct student read_student();
void read_student_p(struct student student3);
void print_student(struct student student2);
int main()
{
struct student student1;
student1 = read_student();
print_student(student1);
read_student_p(student1);
print_student(student1);
system("pause");
return 0;
}
//This is my first function
struct student read_student()
{
struct student student2;
printf("enter student name for first function: n");
scanf("%s",amp;student2.name);
printf("enter student marks for first function:n");
scanf("%f",amp;student2.marks);
return student2;
}
//function to print
void print_student(struct student my_student)
{
printf("Student name in first function is : %sn",my_student.name);
printf("Student marks in first function are: %fn",my_student.marks);
};
//My second function
void read_student_p(struct student student3)
{
printf("enter student name for second function: n");
scanf("%s",amp;student3.name);
printf("enter student marks for second function: n");
scanf("%f",amp;student3.marks);
}
Комментарии:
1. Что происходит, и что вы ожидаете, что произойдет?
2. Он печатает то же имя и помечает даже после вызова второй функции… вы можете видеть, что во второй функции мы снова вводим новое имя и новые метки …. я ожидаю, что он напечатает это
Ответ №1:
Вы имеете в виду написать
void read_student_p(struct student* student3)
^
{
read_student_p(amp;student1);
^
Вам нужно передать указатель на read_student_p
, если вы хотите изменить struct
то, что вы передаете. В настоящее время она передается по значению, и изменения теряются.
Учитывая _p
суффикс, я ожидаю, что это было задумано..
Ответ №2:
Когда вы делаете это:
read_student_p(student1);
И метод выглядит следующим образом:
void read_student_p(struct student student3)
{
printf("enter student name for second function: n");
scanf("%s",amp;student3.name);
printf("enter student marks for second function: n");
scanf("%f",amp;student3.marks);
}
Структуры в C передаются по значению, а не по ссылке.
Итак, что делает read_student_p, так это берет копию структуры, которую вы передаете (student1), редактирует копию, а затем ничего не делает.
Одним из решений было бы вернуть измененную версию структуры. Другой версией было бы передать указатель на структуру и отредактировать структуру с помощью указателя (чтобы вы редактировали ту же копию структуры напрямую).
Ответ №3:
Во второй функции read_student_p
, которую вы вызывали по значению, то есть вы определили новую структурную переменную tmp
в функции и скопировали значение student1
в это значение tmp. Все изменения, которые вы сделали, касались значения tmp, которое не повлияло student1
бы.