Thực hành lập trình C: Con trỏ, Mảng và Thao tác chuỗi

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;
}

Thẻ: C-Language pointers arrays strings memory-management

Đăng vào ngày 6 tháng 6 lúc 17:04