2010-10-13 3 views
1

Скажем, у меня есть эта строка кода в программе:Вопрос гр указателей и * и операторов

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

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

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

Спасибо!

+0

Это было много времени с тех пор, как я использовал чистый C, но это '&' похоже, что он принимает адрес чего-то; как это может быть присвоено 'int' без литья? –

+0

@ Компиляция комминера дает предупреждение об этом! Однако этот пример не предназначен для правильного кода, чтобы просто понять что-то об арифметике указателя. – Kerby82

ответ

6

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

+0

Ну, 'номер + 24'. – zneak

4

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

0

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

0

6[number] такая же, как number[6].

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

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

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

+1

Его код не будет компилироваться в этом состоянии, так как 'int mystery = & 6 [number]' пытается связать 'int *' с 'int'. '& number [6]' зависит от платформы, поскольку он все еще является адресом указателя - на машине x86 это будет 0x18. На x64 это будет 0x30, так как оно начинается с 0. – birryree

1

Я должен отметить, что *(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] 
Смежные вопросы