1. Con trỏ kiểu cấu trúc
Con trỏ kiểu cấu trúc có thể sử dụng để trỏ tới biến cấu trúc, để truy cập các trường dữ liệu của biến cấu trúc thông qua con trỏ bạn có thể kết hợp toán tử giải tham chiếu
Ví dụ 1: Truy cập các trường dữ liệu của struct thông qua con trỏ.
#include "stdio.h" #include "string.h" struct CauThu{ char hoten[50]; char clb[50]; char quoctich[50]; int banthang, kientao; }; typedef struct CauThu CauThu; int main(){ CauThu s; strcpy(s.hoten, "Lionel Messi"); strcpy(s.clb, "PSG"); strcpy(s.quoctich, "Argentina"); s.banthang = 92; s.kientao = 65; CauThu *ptr = &s; printf("Thong tin cau thu : \n"); printf("Ho ten : %s\n", (*ptr).hoten); printf("CLB : %s\n", (*ptr).clb); printf("Quoc tich : %s\n", (*ptr).quoctich); printf("Ban thang : %d, kien tao : %d\n", (*ptr).banthang, (*ptr).kientao); return 0; }
Output :
Thong tin cau thu : Ho ten : Lionel Messi CLB : PSG Quoc tich : Argentina Ban thang : 92, kien tao : 65
Bạn có thể thay thế toán tử giải tham chiếu và toán tử '.' thành toán tử mũi tên '->'
Ví dụ 2 :
#include "stdio.h" #include "string.h" struct CauThu{ char hoten[50]; char clb[50]; char quoctich[50]; int banthang, kientao; }; typedef struct CauThu CauThu; int main(){ CauThu s; strcpy(s.hoten, "Lionel Messi"); strcpy(s.clb, "PSG"); strcpy(s.quoctich, "Argentina"); s.banthang = 92; s.kientao = 65; CauThu *ptr = &s; printf("Thong tin cau thu : \n"); printf("Ho ten : %s\n", ptr->hoten); printf("CLB : %s\n", ptr->clb); printf("Quoc tich : %s\n", ptr->quoctich); printf("Ban thang : %d, kien tao : %d\n", ptr->banthang, ptr->kientao); return 0; }
Output :
Thong tin cau thu : Ho ten : Lionel Messi CLB : PSG Quoc tich : Argentina Ban thang : 92, kien tao : 65
2. Hàm nhập cấu trúc bằng con trỏ
Để viết 1 hàm nhập dữ liệu cho biến cấu trúc từ bàn phím bạn cần dùng con trỏ để sau khi hàm kết thúc thì những thông tin bạn nhập sẽ được giữ nguyên.
Hàm này cần tham số là một con trỏ kiểu cấu trúc, nếu bạn không muốn nhập bằng cấu trúc thì có thể nhập thông tin cho 1 struct rồi trả về struct đó.
Code :
#include "stdio.h" #include "string.h" struct CauThu{ char hoten[50]; char clb[50]; char quoctich[50]; int banthang, kientao; }; typedef struct CauThu CauThu; void nhap(CauThu *x){ printf("Nhap ten : "); gets(x->hoten); printf("Nhap CLB : "); gets(x->clb); printf("Nhap quoc tich : "); gets(x->quoctich); printf("Nhap ban thang, kien tao : "); scanf("%d%d", &x->banthang, &x->kientao); } int main(){ CauThu s; nhap(&s); printf("Thong tin cau thu : \n"); printf("Ho ten : %s\n", s.hoten); printf("CLB : %s\n", s.clb); printf("Quoc tich : %s\n", s.quoctich); printf("Ban thang : %d, kien tao : %d\n",s.banthang, s.kientao); return 0; }
3. Struct với trường dữ liệu là con trỏ
Thông thường các trường dữ liệu của cấu trúc mà cần lưu mảng, ví dụ như là chuỗi ký tự thì ta hay dùng mảng tuy nhiên trường dữ liệu này cũng có thể là con trỏ.
Trong trường hợp các trường dữ liệu này là con trỏ thì khi bạn khai báo biến cấu trúc thì bản thân các trường dữ liệu này sẽ chưa có vùng nhớ để lưu, nên các bạn cần cấp phát động hoặc chỉ định vùng nhớ cho nó nếu không sẽ gây lỗi bộ nhớ.
Ví dụ sau sẽ gây lỗi khi bạn cố tình lưu thông tin cho trường dữ liệu họ tên và lớp ở kiểu con trỏ :
Code :
#include "stdio.h" #include "string.h" struct SinhVien{ char *hoten; char *lop; double gpa; }; typedef struct SinhVien SinhVien; int main(){ SinhVien s; strcpy(s.hoten, "Nguyen Van 28Tech"); strcpy(s.lop, "CNTT"); s.gpa = 2.5; return 0; }
Output :
Process exited after 0.7669 seconds with return value 3221225477
Để không bị lỗi bộ nhớ thì bạn cần có vùng nhớ cho thuộc tính kiểu con trỏ này, có thể dùng một vùng nhớ tạm để lưu hoặc cấp phát động
Code dưới đây mình dùng 2 vùng nhớ tạm và cho 2 thuộc tính con trỏ tới tới vùng nhớ này
Code :
#include "stdio.h" #include "string.h" struct SinhVien{ char *hoten; char *lop; double gpa; }; typedef struct SinhVien SinhVien; int main(){ SinhVien s; char c1[100], c2[100]; s.hoten = c1; s.lop = c2; strcpy(s.hoten, "Nguyen Van 28Tech"); strcpy(s.lop, "CNTT"); s.gpa = 2.5; printf("Ho ten : %s\n", s.hoten); printf("Lop : %s\n", s.lop); printf("Gpa : %.2lf\n", s.gpa); return 0; }
Output :
Ho ten : Nguyen Van 28Tech Lop : CNTT Gpa : 2.50
Bạn cũng có thể cấp phát động cho các thuộc tính kiểu con trỏ
Code :
#include "stdio.h" #include "string.h" #include "stdlib.h" struct SinhVien{ char *hoten; char *lop; double gpa; }; typedef struct SinhVien SinhVien; int main(){ SinhVien s; s.hoten = (char*)malloc(100 * sizeof(char)); s.lop = (char*)malloc(100 * sizeof(char)); strcpy(s.hoten, "Nguyen Van 28Tech"); strcpy(s.lop, "CNTT"); s.gpa = 2.5; printf("Ho ten : %s\n", s.hoten); printf("Lop : %s\n", s.lop); printf("Gpa : %.2lf\n", s.gpa); return 0; }
Output :
Ho ten : Nguyen Van 28Tech Lop : CNTT Gpa : 2.50
Video Struct :