2014-12-14 14 views
5

Cần một chút trợ giúp để hiểu chính xác những gì đang xảy ra trong đoạn mã này. Khi tôi chạy chương trình nó in 7.Tìm hiểu các mảng và con trỏ C

#include <stdio.h> 
int main() { 
int a[] = {1,2,3,4,5,6,7,8,9}; 
int b[] = {1,2,3,4,5,6,7,8,9}; 
int c = 5; 
int *p = a; 
printf("--> %d", (c[b])[p]); 
return 0; 
} 

Tôi chỉ là một chút nhầm lẫn khi nói đến (c [b]) [p] phần trong báo cáo kết quả printf. Bất kỳ trợ giúp/giải thích nào sẽ được đánh giá cao.

+3

'c [b]' có nghĩa là '* (c + b)'. Điều đó sẽ giúp ích. – bzeaman

+0

Có thể trùng lặp [Tên mảng là con trỏ trong C?] (Http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c) – jww

+0

@BennoZeeman Bạn quên một số dấu ngoặc đơn. Họ quan trọng. tức là, xem câu trả lời hiện tại. –

Trả lời

13

Hơi lạ khi được viết theo cách đó, nhưng toán tử [] trong C là giao hoán. Điều đó có nghĩa (c[b])[p] cũng giống như p[b[c]], đó là dễ dàng hơn nhiều để hiểu:

p[b[c]] = p[b[5]] = p[6] = a[6] = 7 

Làm tương tự với các biểu hiện ban đầu sẽ làm việc quá, nó chỉ là một chút lạ để nhìn vào trong nơi:

(c[b])[p] = (5[b])[p] = (b[5])[p]) = 6[p] = p[6] = a[6] = 7 

các giao hoán (nếu đó là một từ) của [] chỉ là do định nghĩa của nó - đó là, a[b] cũng giống như *(a + b), nơi bạn có thể nhìn thấy thứ tự của ab không quan trọng.

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