Con trỏ tới cấu trúc giữ địa chỉ của toàn bộ cấu trúc.
Nó được dùng để tạo các cấu trúc dữ liệu phức tạp như danh sách liên kết, cây, đồ thị, v.v.
Các thành viên của cấu trúc có thể được truy cập bằng toán tử đặc biệt gọi là toán tử mũi tên (->).
Khai báo
Khai báo cho con trỏ tới cấu trúc trong C:
struct tagname *ptr;
Ví dụ: struct student *s;
Truy cập
Cách truy cập con trỏ tới cấu trúc:
Ptr->membername;
Ví dụ: s->sno, s->sname, s->marks;
Ví dụ 1
Chương trình C sau giải thích cấp phát bộ nhớ động cho cấu trúc:
#include <stdio.h>
#include <stdlib.h>
struct person {
int age;
float weight;
char name[30];
};
int main() {
struct person *ptr;
int i, n;
printf("Nhập số người: ");
scanf("%d", &n);
// cấp phát bộ nhớ cho n struct person
ptr = (struct person*) malloc(n * sizeof(struct person));
for (i = 0; i < n; ++i) {
printf("Nhập tên và tuổi: ");
// Truy cập thành viên struct person thứ 1: ptr->name, ptr->age
// Truy cập thành viên struct person thứ 2: (ptr+1)->name, (ptr+1)->age
scanf("%s %d", (ptr+i)->name, &(ptr+i)->age);
}
printf("Hiển thị thông tin:\n");
for (i = 0; i < n; ++i)
printf("Tên: %s\tTuổi: %d\n", (ptr+i)->name, (ptr+i)->age);
return 0;
}
Kết quả
Nhập số người: 1 Nhập tên và tuổi: bhanu 24 Hiển thị thông tin: Tên: bhanu Tuổi: 24
Ví dụ 2
Ví dụ khác về con trỏ và cấu trúc:
#include <stdio.h>
// Khai báo cấu trúc bên ngoài và bên trong
struct Manager {
char Name[15];
int Age;
char Gender;
float Level;
char Role[50];
char temp;
} m[20];
void main() {
int i;
struct Manager *p;
p = &m;
for (i = 1; i < 3; i++) {
printf("Nhập tên manager %d: ", i);
gets(p->Name);
printf("Nhập tuổi manager %d: ", i);
scanf("%d", &p->Age);
scanf("%c", &p->temp); // Xóa bộ đệm
printf("Nhập giới tính manager %d: ", i);
scanf("%c", &p->Gender);
printf("Nhập cấp độ manager %d: ", i);
scanf("%f", &p->Level);
scanf("%c", &p->temp); // Xóa bộ đệm
printf("Nhập vai trò manager %d: ", i);
gets(p->Role);
p++;
}
p = &m;
for (i = 1; i < 3; i++) {
printf("Tên Manager %d là: %s\n", i, p->Name);
printf("Tuổi Manager %d là: %d\n", i, p->Age);
printf("Giới tính Manager %d là: %c\n", i, p->Gender);
printf("Cấp độ Manager %d là: %f\n", i, p->Level);
printf("Vai trò Manager %d là: %s\n", i, p->Role);
p++;
}
}
Kết quả
Nhập tên manager 1: Hari Nhập tuổi manager 1: 55 Nhập giới tính manager 1: M Nhập cấp độ manager 1: 2 Nhập vai trò manager 1: Senior Nhập tên manager 2: Bob Nhập tuổi manager 2: 60 Nhập giới tính manager 2: M Nhập cấp độ manager 2: 1 Nhập vai trò manager 2: CEO Tên Manager 1 là: Hari Tuổi Manager 1 là: 55 Giới tính Manager 1 là: M Cấp độ Manager 1 là: 2.000000 Vai trò Manager 1 là: Senior Tên Manager 2 là: Bob Tuổi Manager 2 là: 60 Giới tính Manager 2 là: M Cấp độ Manager 2 là: 1.000000 Vai trò Manager 2 là: CEO