Con trỏ là biến lưu trữ địa chỉ của biến khác.
Đặc điểm
- Con trỏ tiết kiệm không gian bộ nhớ.
- Thời gian thực thi nhanh hơn do truy cập trực tiếp vị trí bộ nhớ.
- Với con trỏ, bộ nhớ được truy cập hiệu quả: cấp phát và giải phóng động.
- Con trỏ dùng với cấu trúc dữ liệu.
Khai báo và khởi tạo con trỏ
Xét câu lệnh:
int qty = 179;
Trong bộ nhớ, biến được biểu diễn như sau:

Khai báo con trỏ
Ý nghĩa: 'p' là biến con trỏ giữ địa chỉ biến nguyên khác:
int *p;
Khởi tạo con trỏ
Toán tử địa chỉ (&) dùng để khởi tạo con trỏ.
Ví dụ: int qty = 175; int *p; p = &qty;
Mảng con trỏ
Là tập hợp các địa chỉ (hoặc tập hợp con trỏ).
Khai báo
datatype *pointername[size];
Ví dụ: int *p[5]; // mảng 5 con trỏ nguyên
Khởi tạo
Dùng '&' cho khởi tạo.
int a[3] = {10, 20, 30};
int *p[3], i;
for (i = 0; i < 3; i++)
p[i] = &a[i]; // hoặc p[i] = a + i;
Truy cập
Toán tử gián tiếp (*) dùng để truy cập.
for (i = 0; i < 3; i++)
printf("%d", *p[i]);
Chương trình ví dụ
Chương trình mảng con trỏ:
#include <stdio.h>
main() {
int a[3] = {10, 20, 30};
int *p[3], i;
for (i = 0; i < 3; i++)
p[i] = &a[i];
printf("Phần tử mảng:\n");
for (i = 0; i < 3; i++)
printf("%d\t", *p[i]);
}
Kết quả
Phần tử mảng: 10 20 30
Ví dụ 2
Chương trình mảng con trỏ trỏ chuỗi:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *a[5] = {"one", "two", "three", "four", "five"};
int i;
printf("Các chuỗi ở vị trí:\n");
for (i = 0; i < 5; i++)
printf("%d\n", a[i]);
return 0;
}
Kết quả
Các chuỗi ở vị trí: 4210688 4210692 4210696 4210702 4210707