Вопрос о c указателях и * & операторах - PullRequest
2 голосов
/ 14 октября 2010

Допустим, у меня есть такая строка кода в программе:

int * number=0;
int mystery=&6[number];

Mistery - это число, и я могу использовать & 5 или & 4 для получения других чисел.

Но что означает& 6 [] "значит?

Спасибо!

Ответы [ 5 ]

6 голосов
/ 14 октября 2010

6[number] в точности эквивалентно number[6], поэтому вы получаете адрес, который находится в шести целых числах от number. Поскольку число равно 0, а int имеет длину 4 байта, результат равен 24.

5 голосов
/ 14 октября 2010

6[variable] - еще один менее читаемый способ выражения variable[6].Он работает из-за коммутативности сложения: variable[6] совпадает с *(variable + 6), следовательно, 6[variable] совпадает с *(6 + variable).

1 голос
/ 14 октября 2010

Я должен отметить, что *(variable + 6) не точно , как variable[6], это работает только потому, что компилятор знает размер объектов, на которые ссылается переменная (int имеет размер 4 байта ), так что на самом деле происходит добавление указателей: variable + 6*sizeof(int). Это просто абстрагируется компилятором.

Я не совсем уверен (более того, это может зависеть от компилятора), но с массивом структур это может не сработать, потому что struct в два раза больше int:

struct a {
 int a;
 int b;
};

struct a arr[5];

int nmb;

struct a *res = nmb[arr]
0 голосов
/ 14 октября 2010

6[number] совпадает с number[6].

Это интерпретируется как значение шестого элемента (*(number + 6*sizeof(int))), и поскольку number равно нулю, а sizeof(int) обычно 4затем его значение по адресу 24.

. Затем & получает адрес значения по адресу 24, таким образом, mystery равно 24.

[EDIT] Длина int обычно составляет 4 байта, поэтому правильное значение 24.

0 голосов
/ 14 октября 2010

Это выглядит как тошнотворная a[0] == 0[a] "особенность" C, так что вы можете думать о ней как о "адресе индекса 6 в номере массива"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...