Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Cách truyền địa chỉ cấu trúc làm đối số cho hàm trong C


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