Trong C, mối quan hệ giữa biến struct và hàm được hổ trợ đầy đủ các tính năng như hàm đối với các kiểu dữ liệu cơ bản khác.
1. Đối của hàm:
Đối của hàm Tham số thực
Biến cấu trúc Giá trị cấu trúc.
Con trỏ cấu trúc Địa chỉ của biến cấu trúc Mảng cấu trúc hình thức hoặc con trỏ cấu trúc Tên mảng cấu trúc
2. Kết quả trả về của hàm:
Hàm có thể trả về giá trị là: + Giá trị của một struct. + Con trỏ kiểu struct.
3. Cấp phát bộ nhớ động đối với kiểu struct:
Chúng ta có thể dùng hàm malloc( ) hoặc calloc( ) để cấp phát bộ nhớ động cho biến con trỏ struct trong lúc đang chạy chương trình và cũng có thể dùng hàm free( ) để thu hồi lại vùng nhớ.
4. Ví dụ:
- Xét kiểu cấu trúc person gồm 3 thành phần: + ht (họ tên) kiểu mảng char.
+ ns (năm sinh) kiểu struct ngay. + bl (bậc lương) kiểu float.
- Ta thiết kế 3 hàm thao tác trên kiểu person: + Hàm
void input(person *p); dùng để nhập dữ liệu cho một đối tượng kiểu person.
+ Hàm
void output(person p); dùng để in một đối tượng kiểu person.
+ Hàm
person* find1(char *ht,person *ds,int n);
có tác dụng tìm trong danh sách n nhân viên lưu trong con trỏ ds, người có tên cho trong ht. Hàm trả về con trỏ trỏ tới người tìm được hoặc trả về NULL nếu không tìm thấy.
#include<stdio.h> #include<conio.h> #include<alloc.h> #include<string.h> typedef struct { int ngay,thang,nam; }ngay; typedef struct { char ht[25]; ngay ns; float bl; }person; void input(person *p); void output(person p);
person* find1(char *ht, person *ds, int n);
void main( ) { int songuoi,i; char *ht; person *temp; person *ds=NULL; clrscr( );
printf("\nBan muon danh sach co bao nhieu nguoi?"); scanf("%d",&songuoi);
ds = calloc(songuoi,sizeof(person)); for(i=0;i<songuoi;i++)
input(ds+i);
printf("/************************************************/"); printf("\n\n TIM NGUOI");
printf("\nNhap vao ho ten nguoi can tim: "); fflush(stdin);
temp=find1(ht,ds,songuoi); if (temp!=NULL)
{
printf("\nNguoi can tim co ly lich nhu sau:"); output(*temp);
} else
printf("\nKhong tim thay nguoi nay");
printf("\n/************************************************/"); printf("\n\n DANH SACH NHAN SU");
for(i=0;i<songuoi;i++) output(*(ds+i)); free(ds); getch( ); } void input(person *p) { float luong; fflush(stdin);
printf("\nNhap vao ho ten: ");gets(p->ht); printf("\nNhap vao ngay sinh: ");
printf("Ngay: "); scanf("%d",&p->ns.ngay); printf("Thang: "); scanf("%d",&p->ns.thang); printf("Nam: "); scanf("%d",&p->ns.nam);
printf("\nNhap vao luong: "); scanf("%f",&luong); p->bl=luong;
}
void output(person p) {
printf("\nHo ten: %s",p.ht);
printf("\nNgay thang nam sinh: %d-%d-%d",p.ns.ngay,p.ns.thang,p.ns.nam); printf("\nBac luong: %6.0f",p.bl);
}
person* find1(char *ht, person *ds, int n) { person *temp=NULL; int i; for(i=0;i<n;i++) if (strcmpi(ds[i].ht,ht)= =0) temp = (ds+i); return temp; }