char c;
int i;
printf("%02x",c[&i]);
//printf("%02x",c[i]); // doesn't compile, error, cannot access c as array
// "error: subscripted value is neither array nor pointer nor vector"
c[&i] there is SOOOO BAD and WROOONG. Semantically wrong. But apparently not syntactically wrong in c.
Why does it compile?
Because 1. array[i] == *(array+i) == *(i+array) == i[array]
And 2. c casts char to int happily
In case of c[&i] c is the index added to pointer &i.
Now &i + value of c indexes an undefined area of memory so it is not good to use this!!
char c;
int i[10];
// normal access into array (bad to use a char as array index though)
for(c=0;c<10;c++) printf("%02x",i[c]); // normal-ish
for(c=0;c<10;c++) printf("%02x",*(i+c)); // equivalent pointer arithmetic
for(c=0;c<10;c++) printf("%02x",*(c+i)); // equivalent
for(c=0;c<10;c++) printf("%02x",c[i]); // allowed BUT NOT NORMAL
char c;
int i;
int buffer[20]; // buffer helps prog not seg fault!
// abnormal access into memory at offset of (int)c from &i
//for(c=0;c<10;c++) printf("%02x",&i[c]); // COMPILE ERROR
for(c=0;c<10;c++) printf("%02x",*(&i+c)); // a bit weird
for(c=0;c<10;c++) printf("%02x",*(c+&i)); // not normal
for(c=0;c<10;c++) printf("%02x",c[&i]); // but it compiles and runs(mostly)
for(c=0;c<10;c++) printf("%02x,",i[&c]); // this is all
printf(" ");
for(c=0;c<10;c++) printf("%02x,",*(i+&c)); // a bit weird
printf(" ");
for(c=0;c<10;c++) printf("%02x,",*(&c+i)); // not normal
//for(c=0;c<10;c++) printf("%02x,",&c[i]); // COMPILE ERROR
printf("\n");
While answering this question:
http://stackoverflow.com/questions/40116073/c-duplicate-character-character-by-character/40117178#40117178
Asked this question:
http://stackoverflow.com/questions/40118549/in-c-ci-compiles-where-c-and-i-are-variables-not-arrays-pointers-but-i