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 hiểu cách truyền địa chỉ cấu trúc làm đối số cho hàm.
- Địa chỉ của cấu trúc được truyền làm đối số cho hàm.
- Nó được nhận trong một con trỏ tới cấu trúc trong tiêu đề hàm.
Lợi ích
Các lợi ích của việc truyền địa chỉ cấu trúc:
- Không lãng phí bộ nhớ vì không cần tạo bản sao lại.
- Không cần trả về giá trị, vì hàm có thể truy cập gián tiếp toàn bộ cấu trúc và làm việc trên nó.
Ví dụ 1
Chương trình sau minh họa cách truyền địa chỉ 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);
return 0;
}
void display(struct date *p) {
printf("Ngày=%d\n", p->day);
printf("Tháng=%s\n", p->month);
printf("Năm=%d\n", p->year);
}
Kết quả
Nhập ngày, tháng, năm: 20 MAR 2021 Ngày=20 Tháng=MAR Năm=2021
Ví dụ 2
Chương trình C minh họa cấu trúc và hàm bằng cách gọi toàn bộ hàm làm đối số. Do phương pháp gọi hàm này, không lãng phí bộ nhớ, vì không cần sao chép lại và trả về giá trị.
#include <stdio.h>
// Khai báo cấu trúc
struct student {
char Name[100];
int Age;
float Level;
char Grade[50];
char temp;
} s[5];
// Khai báo và trả về hàm
void show(struct student *p) {
int i;
for (i = 1; i < 3; i++) {
printf("Tên sinh viên %d là: %s\n", i, p->Name);
printf("Tuổi sinh viên %d là: %d\n", i, p->Age);
printf("Trình độ sinh viên %d là: %f\n", i, p->Level);
printf("Xếp loại sinh viên %d là: %s\n", i, p->Grade);
p++;
}
}
void main() {
int i;
struct student *p;
for (i = 0; i < 2; i++) {
printf("Nhập tên sinh viên %d: ", i+1);
gets(s[i].Name);
printf("Nhập tuổi sinh viên %d: ", i+1);
scanf("%d", &s[i].Age);
printf("Nhập trình độ sinh viên %d: ", i+1);
scanf("%f", &s[i].Level);
scanf("%c", &s[i].temp); // Xóa bộ đệm
printf("Nhập xếp loại sinh viên %d: ", i+1);
gets(s[i].Grade);
}
p = &s;
show(&s);
}
Kết quả
Nhập tên sinh viên 1: Lucky Nhập tuổi sinh viên 1: 27 Nhập trình độ sinh viên 1: 2 Nhập xếp loại sinh viên 1: A Nhập tên sinh viên 2: Pinky Nhập tuổi sinh viên 2: 29 Nhập trình độ sinh viên 2: 1 Nhập xếp loại sinh viên 2: B Tên sinh viên 1 là: Lucky Tuổi sinh viên 1 là: 27 Trình độ sinh viên 1 là: 2.000000 Xếp loại sinh viên 1 là: A Tên sinh viên 2 là: Pinky Tuổi sinh viên 2 là: 29 Trình độ sinh viên 2 là: 1.000000 Xếp loại sinh viên 2 là: B