Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Con trỏ treo, void, null và wild trong C++


Con trỏ treo (Dangling pointer)

Con trỏ treo là con trỏ trỏ đến vị trí bộ nhớ đã được giải phóng (hoặc xóa). Có nhiều cách khiến con trỏ trở thành treo:

Gọi hàm

Con trỏ trỏ đến biến cục bộ trở thành treo khi biến cục bộ không phải static.

int *show(void) {
    int n = 76; /* ... */
    return &n;
}

Kết quả

Kết quả chương trình sẽ là địa chỉ rác.

Giải phóng bộ nhớ

int main() {
    float *p = (float *)malloc(sizeof(float));
    // cấp phát động
    free(p);
    // sau free(), p thành con trỏ treo
    p = NULL;
    // giờ p không còn treo
}

Biến ra khỏi phạm vi

int main() {
    int *p //mã gì đó//
    {
        int c; p=&c;
    }
    //mã gì đó//
    //p là con trỏ treo ở đây.
}

Con trỏ void (Void pointer)

Con trỏ void không liên kết với bất kỳ kiểu dữ liệu nào. Nó trỏ đến vị trí dữ liệu trong bộ nhớ, tức là địa chỉ của biến. Còn gọi là con trỏ đa năng.

Có một số hạn chế:

  • Không thể thực hiện toán tử con trỏ trên void pointer do kích thước cụ thể.
  • Không thể sử dụng như giải tham chiếu (dereferenced).

Ví dụ

#include<stdlib.h>
#include<iostream>
using namespace std;
int main() {
    int a = 7;
    float b = 7.6;
    void *p;
    p = &a;
    cout<<*( (int*) p)<<endl ;
    p = &b;
    cout<< *( (float*) p) ;
    return 0;
}

Kết quả

7
7.600000

Thuật toán

Begin
    Khởi tạo biến a kiểu int và b kiểu float.
    Khai báo con trỏ void p.
    (int*)p = ép kiểu void.
    p = &b nghĩa là con trỏ void p giờ là float.
    (float*)p = ép kiểu void.
    In giá trị.
End.

Con trỏ Null (Null Pointer)

Con trỏ null là con trỏ không trỏ đến đâu.

Một số dùng của con trỏ null:

  • Khởi tạo biến con trỏ khi chưa gán địa chỉ bộ nhớ hợp lệ.

  • Truyền con trỏ null cho đối số hàm nếu không muốn truyền địa chỉ hợp lệ.

  • Kiểm tra con trỏ null trước khi truy cập biến con trỏ. Để xử lý lỗi trong mã liên quan con trỏ, ví dụ: chỉ giải tham chiếu nếu không NULL.

Ví dụ

#include <iostream>
using namespace std;
int main() {
    int *p= NULL; // khởi tạo con trỏ null
    cout<<"The value of pointer is ";
    cout<<p;
    return 0;
}

Kết quả

The value of pointer is 0.

Con trỏ Wild (Wild Pointer)

Con trỏ wild là con trỏ trỏ đến vị trí bộ nhớ tùy ý (không phải NULL).

int main() {
    int *ptr; // wild pointer
    *ptr = 5;
}