Hằng con trỏ và con trỏ hằng

Trong bài viết này, chúng ta sẽ đến với 2 khái niệm khó nhớ và hay gây nhầm lẫn là: hằng con trỏ và con trỏ hằng.

1. Hằng con trỏ – Constant pointer

Khai báo:

<Kiểu dữ liệu> * const <Tên con trỏ> = <Địa chỉ khởi tạo> ;

Đặc điểm:
– Cần gán ngay giá trị địa chỉ khởi tạo cho hằng con trỏ tại câu lệnh khai báo ban đầu.
– Không thể thay đổi địa chỉ đã được khởi gán cho hằng con trỏ ( sẽ gây ra lỗi).
– Có thể thay đổi giá trị tại địa chỉ đã khởi gián ban đầu.

Ví dụ 1:

#include "stdio.h"
#include "conio.h"

void main()
{
    int* const p; // error
}
Hằng con trỏ
Hằng con trỏ

Chương trình dịch sẽ thông báo lỗi vì hằng con trỏ p không khởi tạo giá trị khi khai báo.

Ví dụ 2:

#include "stdio.h"
#include "conio.h"

void main()
{
    int m = 2;
    int* const p = &m;
    p++; // error
}

Chương trình dịch sẽ thông báo lỗi vì hằng con trỏ không thể thay đổi địa chỉ trỏ tới.

Hằng con trỏ
Hằng con trỏ

Ví dụ 3:

#include "stdio.h"
#include "conio.h"

void main()
{
    int m = 2;
    int* const p = &m;
    printf("\n*p = %d", *p);
    m++;
    printf("\n*p = %d", *p);
    getch();
}

Câu lệnh m++ chỉ làm thay đổi giá trị tại địa chỉ &m.

Hằng con trỏ
Hằng con trỏ

 

2. Con trỏ hằng – Pointer to constant

Khai báo:

const <Kiểu dữ liệu> * <Tên con trỏ>;

Đặc điểm:
– Không được phép dùng trực tiếp con trỏ hằng để thay đổi giá trị tại vùng nhớ mà con trỏ hằng đang trỏ đến.
– Con trỏ hằng có thể thể thay đổi địa chỉ trỏ tới (hay nói cách khác: nó có thể trỏ đến các ô nhớ khác nhau).
Ví dụ 4:

#include "stdio.h"
#include "conio.h"

void main()
{
    int m = 3;
    const int* p;
    p = &m;
    m++;
    (*p)++; // error
}

Câu lệnh m++ hoàn toàn hợp lệ, còn câu lệnh (*p)++ gây ra lỗi thay đổi giá trị tại vùng nhớ.

Ví dụ 5:

#include "stdio.h"
#include "conio.h"

void main()
{
    int m = 3, n = 5;
    const int* p;
    p = &m;
    printf("\n*p = %d", *p);
    p = &n;
    printf("\n*p = %d", *p);
    getch(); 
}
Con trỏ hằng
Con trỏ hằng

 

Be the first to comment

Leave a Reply