2012-12-06 32 views
12

Dưới đây là một đoạn mã được sao chép từ website. Giá trị được đặt cho hướng in ký tự tương ứng từ "nsew". Ví dụ đầu ra của mã này là ký tự w.Tại sao tham chiếu mảng C này trông không chính xác?

Tôi tự hỏi nó hoạt động như thế nào.

#include<stdio.h> 
void main (void){ 
    int direction = 3; 
    char direction_name = direction["nsew"]; 
    printf("%c",direction_name); 
} 

Trả lời

17

Điều này là do các nhà điều hành mảng subscript là giao hoán, nghĩa là đây:

const char *p = "Hello"; 
char x = p[0]; 

là tương đương với

const char *p = "Hello"; 
char x = 0[p]; 

Weird, huh? Trong trường hợp của bạn, bạn đang lập chỉ mục vào vị trí thứ ba của chuỗi ký tự (là một mảng) "nsew".

some_ptr[n] tương đương với *(some_ptr + n) và do cộng thêm là giao hoán, nó cũng tương đương với *(n + some_ptr). Sau đó, sau đó n[some_ptr] cũng là một biểu thức tương đương.

Tôi sẽ không khuyên bạn sử dụng tính năng này "tuy nhiên ... nghiêm túc, đừng làm điều đó.

+5

1 cho * Tôi sẽ không khuyên bạn sử dụng tính năng này "" Tuy nhiên * –

+1

Hoặc: 'p [0]' giống với '* (p + 0)' và '+' là kết hợp. –

+0

Nhận xét của Brian mang lặp lại: không làm điều này. – msw

8

Nhà điều hành [] có cùng ngữ nghĩa như con trỏ arithmetics. Vì vậy, a[i] tương đương với *(a + i) tương đương với *(i + a) tương đương với i[a]:

Vì vậy direction["nsew"] == "nsew"[direction] == "nsew"[3] == 'w'

+1

+1 Tôi thích lời giải thích này, ít nhất có một phương pháp cho sự điên rồ –

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