Nếu biểu thức type name[count]
được viết trong một số hàm thì bạn báo cho trình biên dịch C phân bổ trên sizeof(type)*count
byte khung ngăn xếp và tính địa chỉ của phần tử đầu tiên trong mảng.
Nếu biểu thức type name[count]
được viết bên ngoài tất cả các định nghĩa hàm và cấu trúc thì bạn yêu cầu trình biên dịch C phân bổ trên các sizeof(type)*count
byte của phân đoạn dữ liệu và tính địa chỉ của phần tử đầu tiên trong mảng.
name
thực sự là đối tượng hằng lưu trữ địa chỉ của phần tử đầu tiên trong mảng và mọi đối tượng lưu trữ địa chỉ của một số bộ nhớ được gọi là con trỏ, vì vậy đây là lý do bạn coi name
là con trỏ chứ không phải là mảng. Lưu ý rằng các mảng trong C chỉ có thể được truy cập thông qua các con trỏ.
Nếu count
là một biểu thức hằng ước lượng bằng 0 thì bạn yêu cầu trình biên dịch C phân bổ byte bằng 0 trên khung ngăn xếp hoặc phân đoạn dữ liệu và trả về địa chỉ của phần tử đầu tiên trong mảng, nhưng vấn đề trong việc này là phần tử đầu tiên của mảng có độ dài bằng không tồn tại và bạn không thể tính địa chỉ của thứ gì đó không tồn tại.
Đây là lý do mà yếu tố không. count+1
không tồn tại trong count
mảng thứ cấp, vì vậy đây là lý do mà trình biên dịch C cấm định nghĩa mảng có độ dài bằng 0 là biến trong và ngoài hàm, bởi vì nội dung của name
nó là gì? Địa chỉ nào name
lưu trữ chính xác?
Nếu p
là một con trỏ thì biểu thức p[n]
tương đương với*(p + n)
Trong đó dấu hoa thị * trong biểu thức bên phải là hoạt động bổ nhiệm của con trỏ, có nghĩa là truy cập vào bộ nhớ được trỏ bởi p + n
hoặc truy cập vào bộ nhớ có địa chỉ được lưu trữ p + n
, trong đó p + n
là biểu thức con trỏ, nó lấy địa chỉ p
và thêm vào địa chỉ này n
nhân số kích thước của loại con trỏ p
.
Có thể thêm một địa chỉ và một số?
Có, bởi vì địa chỉ là số nguyên không dấu thường được biểu diễn trong ký hiệu thập lục phân.