Con trỏ hằng và Hằng con trỏ trong C/C++ – Minh Hoàng Blog | Cùng nhau chia sẻ kiến thức lập trình, tự học tiếng Nhật online và cuộc sống Nhật Bản!

2. Con trỏ hằng (Pointer to constant) là gì?

2.

Con trỏ hằng (Pointer to constant) là gì?

■ Khai báo:

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

■ Đặc điểm:

  • Con trỏ hằng

    có thể trỏ đến các ô nhớ khác nhau

    (có thể trỏ đi lung tung trong bộ nhớ, các phép toán tăng giảm địa chỉ của con trỏ hoàn toàn hợp lệ).

  • Nhưng

    không thể thay đổi giá trị

    tại ô nhớ mà nó đang trỏ đến.

Có thể bạn quan tâm: Cách cấp phát và giải phóng bộ nhớ trong lập trình C.

* Các bạn có thể nhận thấy nó ngược với hằng con trỏ đã nói ở trên.

* Ví dụ điển hình là hàm strlen mà chúng ta hay sử dụng để lấy chiều dài của một chuỗi:

size_t strlen ( const char * str );

Ví dụ 1: Con trỏ hằng có thể thay đổi địa chỉ mà nó trỏ tới.

#include <stdio.h>

int main()
{
	int num1 = 2;
	int num2 = 10;
	char *blog = "minhhn.com";

	const int *p;

	p = &num1;
	printf("\nGia tri nhan duoc: %d", *p);	// Output: 2

	p = &num2;
	printf("\nGia tri nhan duoc: %d", *p);	// Output: 10

	p = blog;
	printf("\nGia tri nhan duoc: %s", p);	// Output: minhhn.com

	getchar();
	return 0;
}

Ví dụ 2: Con trỏ hằng không thể thay đổi giá trị của địa chỉ mà nó trỏ tới.

#include <stdio.h>

int main()
{
	int m = 3;

	const int *p;

	p = &m;

	m = 20;		// ok
	m++;		// ok

	*p = 99;	// error
	(*p)++;		// error

	return 0;
}

Khi bạn code trong 1 project C lớn một tí hoặc lớn nhiều tí, giả sử bạn có 1 hàm, thao tác với 1 mảng, hàm này chỉ đọc mảng thôi, không làm thay đổi các giá trị trong mảng. Và quan trọng là, khi share code cho các bạn khác trong cùng project, làm sao để họ biết điều này???
Vậy ta sẽ cài đặt hàm của mình như sau:

#include <stdio.h>
/*	
	Đối với trường hợp con trỏ hằng là tham số thì:
	void Xuly(const int *) và void Xuly(int const *) 
	là như nhau, từ const khi đóng góp vào trong tham số hình thức là như nhau.
*/
void Xuly(const int *a, int n)
{
	// Xử lý gì đó
}

int main()
{
	int a[] = { 1,2 };
	int n = 2;

	Xuly(a, n); // Khi sử dụng hàm này tôi hiểu là: nó ko thay đổi các giá trị mảng a của tôi đâu
				// yên tâm xài, nếu có lỗi gì đó thì ko phải sinh ra từ đây.
	return 0;
}