2010-06-07 42 views

Trả lời

10

Vâng, a là địa chỉ của phần tử đầu tiên của mảng và & a là địa chỉ của mảng, nhưng rõ ràng cả hai đều có cùng địa chỉ.

Tuy nhiên khi bạn thêm (hoặc trừ) một số từ con trỏ, trình biên dịch sẽ lấy kích thước của dữ liệu để xem xét trong trường hợp của bạn (giả sử kích thước của int là 4 byte) a +1 sẽ lớn hơn 4 bởi vì bạn di chuyển con trỏ một số nguyên phía trước, nhưng & a + 1 sẽ lớn hơn 40 bởi vì bạn có nhiều con trỏ một ARRAY của 10 INTEGERS phía trước.

21

Cả hai câu lệnh đều in ra địa chỉ và có thể có nghĩa là giải thích số học con trỏ.

a&a KHÔNG giống nhau, chúng có các loại khác nhau nhưng giữ cùng một địa chỉ bộ nhớ.

&a là loại int (*)[10] (mà hoạt động như một con trỏ đến một mảng)
a là loại int [10] (mà hoạt động như một con trỏ đến một yếu tố duy nhất)

Vì vậy, khi bạn thêm 1 giữ những loại trong lí trí. Con trỏ sẽ được bù đắp bằng kích thước của loại địa chỉ chứa. a+1 bù đắp theo kích thước của int, tức là thành phần tử thứ hai trong mảng. &a+1 bù trừ hoàn toàn qua toàn bộ mảng.

+1

Đó là gần như tất cả các loại trong C là về: số học và kích thước. – mathk

+0

Để hoàn thành, sẽ tốt hơn nếu thêm '& a [0]' là kiểu 'int *' và sẽ hoạt động rất giống 'a'. – Hugues

+0

@Brian R.Bondy SO chúng ta có thể sử dụng 'sizeof' để chỉ ra những khác biệt trong các loại của chúng? – sikisis

Các vấn đề liên quan