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

Khai báo
int *p;
'p' là con trỏ giữ địa chỉ biến int khác.
Khởi tạo
Toán tử & khởi tạo con trỏ.
int qty = 175; int *p; p = &qty;
Truy cập biến qua con trỏ
Toán tử * truy cập giá trị.
Ví dụ
Chương trình C nhân hai ma trận bằng con trỏ:
#include <stdio.h>
#define ROW 3
#define COL 3
void matrixInput(int mat[][COL]);
void matrixPrint(int mat[][COL]);
void matrixMultiply(int mat1[][COL], int mat2[][COL], int res[][COL]);
int main(){
int mat1[ROW][COL], mat2[ROW][COL], product[ROW][COL];
printf("Nhap ma tran thu nhat %dx%d\n", ROW, COL);
matrixInput(mat1);
printf("Nhap ma tran thu hai %dx%d\n", ROW, COL);
matrixInput(mat2);
matrixMultiply(mat1, mat2, product);
printf("Tich hai ma tran:\n");
matrixPrint(product);
return 0;
}
void matrixInput(int mat[][COL]){
int row, col;
for(row = 0; row < ROW; row++){
for(col = 0; col < COL; col++){
scanf("%d", (*(mat + row) + col));
}
}
}
void matrixPrint(int mat[][COL]){
int row, col;
for(row = 0; row < ROW; row++){
for(col = 0; col < COL; col++){
printf("%d ", *(*(mat + row) + col));
}
printf("\n");
}
}
void matrixMultiply(int mat1[][COL], int mat2[][COL], int res[][COL]){
int row, col, i, sum;
for(row = 0; row < ROW; row++){
for(col = 0; col < COL; col++){
sum = 0;
for(i = 0; i < COL; i++){
sum += (*(*(mat1 + row) + i)) * (*(*(mat2 + i) + col));
}
*(*(res + row) + col) = sum;
}
}
}
Đầu ra
Kết quả chạy chương trình:
Nhap ma tran 1 3x3: 2 3 1 2 5 6 2 6 8 Nhap ma tran 2 3x3: 1 2 1 2 3 4 5 6 7 Tich: 13 19 21 42 55 64 54 70 82