1. Quản lý mảng và con trỏ
Trong C, việc truyền mảng vào hàm thực chất là truyền địa chỉ của phần tử đầu tiên. Dưới đây là ví dụ minh họa cách tìm giá trị nhỏ nhất và lớn nhất trong một mảng sử dụng con trỏ để trả về kết quả thông qua tham số:
#include <stdio.h>
void get_range(int *arr, int len, int *min, int *max) {
*min = *max = arr[0];
for (int i = 1; i < len; i++) {
if (arr[i] < *min) *min = arr[i];
if (arr[i] > *max) *max = arr[i];
}
}
int main() {
int data[] = {12, 5, 8, 20, 3};
int min_val, max_val;
get_range(data, 5, &min_val, &max_val);
printf("Min: %d, Max: %d\n", min_val, max_val);
return 0;
}
2. Thao tác với chuỗi và bộ nhớ
Sự khác biệt giữa mảng ký tự và con trỏ chuỗi nằm ở khả năng sửa đổi bộ nhớ. Mảng ký tự được cấp phát vùng nhớ cố định trên stack, trong khi con trỏ chuỗi thường trỏ vào vùng nhớ hằng (string literal).
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "World";
char temp[10];
// Hoán đổi nội dung chuỗi bằng cách sao chép
strcpy(temp, str1);
strcpy(str1, str2);
strcpy(str2, temp);
printf("str1: %s, str2: %s\n", str1, str2);
return 0;
}
3. Truy cập mảng hai chiều bằng con trỏ
Mảng hai chiều có thể được duyệt qua bằng con trỏ cấp cao hơn (con trỏ trỏ đến một mảng). Kỹ thuật này giúp tối ưu hóa việc truy cập dữ liệu trong ma trận.
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
int (*ptr)[3] = matrix;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", *(*(ptr + i) + j));
}
printf("\n");
}
4. Xử lý và mã hóa chuỗi
Dưới đây là kỹ thuật thay thế ký tự trong chuỗi thông qua con trỏ và thuật toán mã hóa Caesar đơn giản:
void apply_shift(char *str, int shift) {
while (*str) {
if (*str >= 'a' && *str <= 'z') {
*str = 'a' + (*str - 'a' + shift) % 26;
}
str++;
}
}
5. Kiểm tra tính hợp lệ của dữ liệu (ID)
Việc kiểm tra định dạng của các chuỗi số (như ID) đòi hỏi sự chặt chẽ về độ dài và ký tự cho phép:
int validate_id(char *id) {
if (strlen(id) != 18) return 0;
for (int i = 0; i < 17; i++) {
if (id[i] < '0' || id[i] > '9') return 0;
}
return 1;
}