Lỗi hay dùng với pointer


1. Lỗi con trỏ hằng và hằng con trỏ 

con trỏ hằng là con trỏ trỏ đến 1 vùng nhớ hằng , giá trị ko thể thay đổi được . Như char *p = “Bui Tan Quang”

hằng con trỏ là giá trị của con trỏ là 1 hằng số , hay địa chỉ ô nhớ mà con trỏ trỏ đến ko thay đổi . Như mảng , chuỗi . char p[] = “Bui Tan Quang”

void main()
{
char *p=”Bui Tan Quang” khác hoàn toàn với char p[]=”Bui Tan Quang”;

p++; Sai nếu khai báo là char p[];

*p++; <<<<<<<<<<<<<<<<<<<<<<< báo lỗi tại đây Đúng nếu khai báo là char p[];
p[2]=’b’;<<<<<<<<<<<<<<<<<<<<<<< báo lỗi tại đây Đúng nếu khai báo là char p[];
}
Tại sao lại khác biệt như thế trong khi giáo trình viết là *p <=> p[] vậy ạ?

Giải thích :

Chuỗi “Bui Tan Quang” ở trên được lưu tại vùng rdata session ( vùng nhớ const – chỉ có thể đọc ,không thể thay đổi giá trị tại vùng nhớ đó)
char *p=”Bui Tan Quang”; ->p đơn giản chỉ trỏ tới vùng rdata này mà thôi, p là con trỏ ,p++ bình thường
Nhưng : char p[]=”Bui Tan Quang”; thì lúc này p cũng là 1 con trỏ, nhưng bản thân nó là hằng, nên không thể trỏ tới chỗ khác ( mà việc làm p++ , thì bạn đã cố tình muốn nó trỏ chỗ khác , nên lỗi)

*p++; <<<<<<<<<<<<<<<<<<<<<<< báo lỗi tại đây Đúng nếu khai báo là char p[];
p[2]=’b’;<<<<<<<<<<<<<<<<<<<<<<< báo lỗi tại đây Đúng nếu khai báo là char p[];

thì như mình đã nói hiện tại p đang trỏ tới 1 vùng nhớ const , nghĩa là bạn không thể thay đổi giá trị vùng nhớ đó ( mà cụ thể là bạn không thể thay đổi gia trị chưa “Bui Tan Quang” ở trên) –> Mà *P++ và p[2]=’b’; đã đi ngược điều này.

Vậy bạn sẽ thắc mặc tại sao: char p[]=”Bui Tan Quang”; lại đúng với 2 câu lệnh trên .
–>như mình nói: “Bui Tan Quang”; lưu tại vùng nhớ const , nhưng lúc char p[]=”Bui Tan Quang”; thì p sẽ đc cấp phát trên bộ nhớ stack và sao chép nội dung “Bui Tan Quang”; sang vùng nhớ mới cấp phát đó. Và tất nhiên bạn có thể thay đổi vùng nhớ stack này.

2. Hằng con trỏ

There are also differences, of course. You cannot assign two arrays; the code

	int a[10], b[10];
	a = b;				/* WRONG */

is illegal. As we’ve seen, though, you can assign two pointer variables:

	int *ip1, *ip2;
	ip1 = &a[0];
	ip2 = ip1;

Bình luận về bài viết này