2012-12-06 20 views
12

Aşağıda, website numaralı telefondan kopyalanan bir kod parçası yer almaktadır. Yön için ayarlanan değer ilgili karakteri "nsew" biçiminde yazdırır. Örneğin bu kodun çıkışı karakter w'dir.Bu C dizisi başvurusu neden yanlış görünüyor?

Nasıl çalıştığını merak ediyorum.

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

ha

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

Garip eşdeğerdir: dizi indis operatörü, yani, bu, değişmeli çünkü

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

cevap

17

Bu? Durumunuzda, dize değişmezinin (bir dizi olan) "nsew" üçüncü konumuna dizinlenirsiniz.

some_ptr[n], *(some_ptr + n) ile eşdeğerdir ve ekleme değişkeni olduğundan, aynı zamanda *(n + some_ptr)'a eşdeğerdir. Daha sonra n[some_ptr]'un da eşdeğer bir ifade olduğunu izler.

Bu "özellik" özelliğini kullanmamanızı tavsiye etmem ancak ... ciddi olarak yapma.

+5

1 * Ancak bu "özelliğini" seçeneğini kullanarak tavsiye etmem * –

+1

Veya: 'p [0]', '* (p + 0)' ile aynıdır ve '+, çağrıştırıcıdır. –

+0

Brian'ın yorumu tekrarlayan ayılar: bunu yapma. – msw

8

Operatör [], pointer arithmetics ile aynı semantik var. Yani a[i]i[a] eşdeğerdir hangi *(i + a) eşdeğerdir *(a + i) eşdeğerdir:

Yani direction["nsew"] == "nsew"[direction] == için "nsew"[3] == 'w'

+1

+1 Bu açıklamayı beğendim, en azından deliliğin bir yöntemi var –

İlgili konular