2014-12-07 4 views
0

Я работаю над обновлением кода серверного проекта с тех пор. Я нашел строку, что я не могу понять (который комментировал)Int * t; и это t [* t] - Определение типа

Во-первых, я получаю:

int *t; 

Тогда я получил это (с комментариями):

t[*t]; 

То, что тип этого "t [* t]"

ответ

2

Тип int lvalue. У нас есть две части:

*t    // this is an int 
t[ some int ] // this is standard array indexing 

Или для простого примера:

int array[] = {1, 2, 3, 4}; 
int* t = array; 

С этой установки:

t[*t] == t[1] == 2 

Или:

t[*t] = 7; 

// now array[] holds {1, 7, 3, 4} 
+0

Это также совершенно нечитаемым. Просто говорю. (Не ваш код, 't [* t]'). – keyser

+0

@keyser: Если это нечитаемо ('t [* t]'), дождитесь, пока вы перейдете к простейшим шаблонам или почти ни о чем другом. – Deduplicator

+0

Спасибо вам за ваш ответ! но как вы получаете int & from int? Потому что, хотя тип был Int? – John

0

Иногда код оценивается по количество типизированных символов. Поэтому я хотел бы написать более запутанный код, но с большим количеством символов, например :)

(t + *t)[*t]; 

По отношению к вашему примеру

*t некоторое целое число хранится в t что *t эквивалентно t[0]. Таким образом, в выражении t[*t] там используется арифметика указателей

t + *t 

или

t + t[0] 

, что дает некоторый новый указатель, который затем разыменовывается

*(t + *t) 
1

Тип является int

*t эквивалентно t[0] в качестве такого вашего выражения эквивалентно следующим образом:

t[*t] == t[t[0]] == t[offset] (если вы считаете offset = t[0])

0

По определению языка, учитывая, что t является указателем, то выражение t[*t] полностью эквивалентно выражению *(t + *t).

Чтобы проанализировать тип этого выражения, давайте рассмотрим его шаг для шага, изнутри. Я заменю каждое выражение целого типа, было идентифицировано «type».

С t имеет тип int*, у нас есть *(«int*» + *«int*»).

Вывод данных на номер int* дает значение l. Поэтому получаем *(«int*» + «int»).

Теперь добавление целого числа в указатель дает, опять же, указатель того же типа, поэтому выражение сводится к *«int*».

Но это опять же разыменование указателя на int, и поэтому конечный тип выражения равен lvalue int.

0

operator[] из int*всегда возвращает int.
С *t просто возвращает первый элемент t, t[*t] - это элемент t, на который указывает первый элемент t.

Пример:

int *t; 
t=new int[5]; 
for(int i=0;i<5;++i){ 
    t[i]=i+1; 
}   // t now points to {1,2,3,4,5} 
t[*t];  // <--- What does this evaluate to? 

В этом случае t[*t] будет 2.
Поскольку *t 1, t[1] является вторым элементом в массиве, который является 2.

Смежные вопросы