Có ba cách để truyền giá trị của cấu trúc từ hàm này sang hàm khác:
- Truyền từng thành viên riêng lẻ làm đối số.
- Truyền toàn bộ cấu trúc làm đối số.
- Truyền địa chỉ của cấu trúc làm đối số.
Hãy xem cách truyền toàn bộ cấu trúc làm đối số cho hàm.
- Tên biến cấu trúc được đưa làm đối số trong lời gọi hàm.
- Nó được thu nhận trong một biến cấu trúc khác trong tiêu đề hàm.
- Nhược điểm là một bản sao của toàn bộ cấu trúc được tạo lại, lãng phí bộ nhớ.
Ví dụ 1
Chương trình sau minh họa cách truyền toàn bộ cấu trúc làm đối số:
#include <stdio.h>
struct date {
int day;
char month[10];
int year;
};
int main() {
struct date d;
printf("Nhập ngày, tháng, năm: ");
scanf("%d%s%d", &d.day, d.month, &d.year);
display(d); // truyền toàn bộ cấu trúc làm đối số
return 0;
}
void display(struct date d) {
printf("Ngày=%d\n", d.day);
printf("Tháng=%s\n", d.month);
printf("Năm=%d\n", d.year);
}
Kết quả
Nhập ngày, tháng, năm: 18 JAN 2021 Ngày=18 Tháng=JAN Năm=2021
Ví dụ 2
Ví dụ khác minh họa việc truyền toàn bộ cấu trúc làm đối số:
#include <stdio.h>
// Khai báo cấu trúc
struct add {
int var1;
int var2;
} a;
// Khai báo và trả về hàm
void show(struct add a) {
int sum;
sum = a.var1 + a.var2;
printf("Giá trị cộng là %d", sum);
}
void main() {
struct add a;
printf("Nhập biến 1 = ");
scanf("%d", &a.var1);
printf("Nhập biến 2 = ");
scanf("%d", &a.var2);
show(a);
}
Kết quả
Nhập biến 1 = 20 Nhập biến 2 = 50 Giá trị cộng là 70
Ví dụ 3
Chương trình C khác minh họa việc truyền toàn bộ cấu trúc làm đối số, giải thích khai báo cấu trúc, hàm trả về, v.v.
#include <stdio.h>
// Khai báo cấu trúc
struct student {
int s1, s2, s3;
} s[5];
// Khai báo và trả về hàm
void addition(struct student s[]) {
int i, sum;
for (i = 1; i < 4; i++) {
sum = s[i].s1 + s[i].s2 + s[i].s3;
printf("Sinh viên %d đạt tổng %d\n", i, sum);
}
}
void main() {
int i;
for (i = 1; i < 4; i++) {
printf("Nhập điểm sinh viên %d môn 1 = ", i);
scanf("%d", &s[i].s1);
printf("Nhập điểm sinh viên %d môn 2 = ", i);
scanf("%d", &s[i].s2);
printf("Nhập điểm sinh viên %d môn 3 = ", i);
scanf("%d", &s[i].s3);
}
addition(s);
}
Kết quả
Nhập điểm sinh viên 1 môn 1 = 25 Nhập điểm sinh viên 1 môn 2 = 89 Nhập điểm sinh viên 1 môn 3 = 45 Nhập điểm sinh viên 2 môn 1 = 12 Nhập điểm sinh viên 2 môn 2 = 45 Nhập điểm sinh viên 2 môn 3 = 89 Nhập điểm sinh viên 3 môn 1 = 12 Nhập điểm sinh viên 3 môn 2 = 78 Nhập điểm sinh viên 3 môn 3 = 12 Sinh viên 1 đạt tổng 159 Sinh viên 2 đạt tổng 146 Sinh viên 3 đạt tổng 102