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;

Kích thước bộ nhớ của struct


 Kích thước của struct theo lý thuyết nó sẽ là kích thước tổng cộng của các dữ liệu thành viên. Tuy nhiên, theo cách thức tổ chức bộ nhớ, các dữ liệu thành viên của một struct sẽ được sắp xếp liền kề nhau. Việc tổ chức bộ nhớ của hệ thống máy tính sẽ theo xu hướng là nhóm 4 bytes. Điều này có nghĩa là, nếu dữ liệu thành viên thứ nhất đã lấp vào một số byte bộ nhớ, và nếu còn thừa, thì hệ điều hành sẽ xem xét để đưa dữ liệu thành viên tiếp theo vào. Nếu dữ liệu thành viên tiếp theo chiếm một số lượng các byte bộ nhớ còn thừa, thì nó sẽ được lấp vào phần bộ nhớ còn thừa đó. Nhưng nếu vượt quá, thì hệ thống sẽ được định hướng bổ sung thêm một nhóm 4 byte bộ nhớ mới để chứa dữ liệu thành viên tiếp theo (nếu cần nhiều hơn thì cung cấp tiếp nhóm 4 byte nữa). Còn đối với số byte còn thừa, nó vẫn được để trống.