Double pointer (pointer to pointer) và ứng dụng?

Double pointer là gì?

Chúng ta đã biết con trỏ lưu trữ địa chỉ của biến. Khi con trỏ lưu trữ địa chỉ của 1 con trỏ thì được gọi là double pointer hoặc pointer to pointer.

Khai báo:

<kiểu dữ liệu>** <tên con trỏ>;

Ví dụ 1: khai báo double pointer

int** pInt;
char** pStr;
float** pFt; 

Để hiểu double pointer, chúng ta cùng xem ví dụ 2 và hình minh họa dưới đây
Ví dụ 2: khai báo double pointer và phép gán.

int num = 123;
int* pInt1 = &num;
int** pInt2 = &pInt1;

Giải thích:
– Biến int num có giá trị 123 được lưu tại địa chỉ &num = 0x1235F
– Con trỏ pInt1 trỏ tới biến num, giá trị pInt1 = &num = 0x1235F, *pInt1 = num = 123
– Con trỏ double pInt2 trỏ tới con trỏ pInt1, giá trị pInt2 = &pInt1 = 0x5094F, *pInt2 = pInt1 = &num = 0x1235F, **pInt2 = *pInt1 = num = 123

Ứng dụng double pointer?

Một trong những ứng dụng phổ biến nhất double pointer là thay đổi giá trị của con trỏ được truyền vào như 1 đối số của hàm. Xét ví dụ sau
Ví dụ 3: Viết hàm cấp phát bộ nhớ động sử dụng tham số double pointer

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

bool memalloc(int**, int);
void memfree(int**);

void main()
{
    int* pInt;
    bool bRes = memalloc(&pInt, 100);
    if (bRes)
    {
        printf("\nMemmory allocation is successful");
    }
    memfree(&pInt);
}

bool memalloc(int** p, int sz)
{
    *p = (int*)malloc(sz * sizeof(int));
    if (*p == NULL)
    {
        *p = NULL;
        return false;
    }
    memset(*p, 0x00, sz * sizeof(int));
    return true;
}

void memfree(int** p)
{
    if (*p)
    {
        free(*p);
        *p = NULL;
    }
}

Giải thích:
Sau khi thực hiện hàm memalloc(), con trỏ pInt trỏ tới vùng nhớ 100 byte. Sau khi thực hiện hàm memfree(), giải phóng vùng nhớ trỏ bởi pInt và pInt được gán bằng NULL.

Output:

Memmory allocation is successful

Be the first to comment

Leave a Reply