Какое значение * в начале выражения C? - PullRequest
3 голосов
/ 10 февраля 2010

Просто быстрый вопрос для людей, которые немного знают c. Какое значение имеет * в начале выражения. как в ...

If (this == thisThingOverHere)
ThisThing = *((WORD *) &Array[withThisPosition]);

Можно предположить, что WORD является 16-разрядным беззнаковым, а массив - 8-разрядным байтовым массивом. Удивительно сложно попытаться выяснить, что здесь происходит.

Приветствия

Ответы [ 7 ]

8 голосов
/ 10 февраля 2010

Нетрудно понять, что происходит. Давайте разберемся с этим.


&Array[withThisPosition]

Это говорит, что взять адрес элемента withThisPosition в Array. Эквивалент Array + withThisPosition.


(WORD *)

Здесь говорится, что указатель, возвращаемый &Array[withThisPosition], фактически является указателем на WORD. Это известно как «приведение», потому что вы говорите компилятору обрабатывать объект не так, как изначально Array.

Наконец:


*(...)

Это говорит о возвращении объекта, на который указывает. Таким образом, СЛОВО в указанном объекте возвращается.

Если бы я переписал это для вас, я мог бы предложить:


If (this == thisThingOverHere) {
  void *pointerToArrayELement;
  WORD *pointerToWORD;
  WORD result;

  pointerToArrayElement = &Array[withThisPosition];
  pointerToWORD = (WORD *)pointerToArrayElement;
  result = *pointerToWORD;

  ThisThing = result;
}
6 голосов
/ 10 февраля 2010

разыменяем указатель и получаем соответствующее значение.

пример:

#include <stdio.h>

int main(int argc, char **argv) { 
     int *i_ptr;
     int i, j;

     i = 5;
     i_ptr = &i;

     j = *i_ptr;

     printf("%d\n", j);
     return 0;
}

печатает 5

В C у вас есть области памяти (думаю, что-то вроде "ящиков"), и ценности идут внутри них.У каждой ячейки памяти есть адрес, и вы можете сохранить этот адрес в «переменной указателя», которая объявляется с типом, за которым следует *.Например, i_ptr - указатель на целое число (int *), а i и j - целые числа.Это означает, что в памяти было выделено три «блока», два будут готовы содержать действительные числа (i и j), а один (i_ptr) будет готов содержать адрес для другого блока, ивы сообщаете компилятору, что указанный ящик будет содержать число.

с & вы получите адрес коробки из имени блока: &i даст вам адрес i, и вы можетесохраните его в i_ptr.

Если у вас есть адрес ящика и вы хотите посетить ящик и получить значение, которое вы используете, *, например, *i_ptr дает вам значение, содержащееся вполе по адресу, содержащемуся в i_ptr.

2 голосов
/ 10 февраля 2010

this-> value совпадает с * (this). Значение это для разыменования указателя.

1 голос
/ 10 февраля 2010

Использование * в C немного сбивает с толку, потому что оно имеет два разных, но взаимосвязанных значения. Ваш пример сбивает с толку, потому что ОБА из этих значений используются в одной строке кода.

Когда непосредственно рядом с типом, * является модификатором, который указывает, что вы ссылаетесь на указатель на этот тип. Это чаще всего наблюдается в объявлениях переменных, но может использоваться и в приведениях, как вы видите здесь с (WORD *).

Когда не используется с типом, * - это унарный оператор, который разыменовывает указатель. Другими словами, он принимает значение операнда, обрабатывает его как ячейку памяти и возвращает содержимое этой ячейки. Оператор также определяет тип переменной, на который указывает операнд, и приводит значение в ячейке памяти к этому типу. Компилятор обычно выполняет проверку, чтобы убедиться, что операнд фактически является указателем. В этом случае компилятор знает, что &Array[withThisPosition]) - это указатель на байт, потому что Array - это массив байтов.

Возвращаясь к вашему вопросу, ОБЫЧНО, когда * находится в начале оператора C, это оператор разыменования, но я не буду гарантировать, что это всегда так.

Указатели давали мне меньше головной боли, когда я разделял два значения * в моем мозгу.

1 голос
/ 10 февраля 2010

Вероятно, проще всего посмотреть на выражение по частям, а затем сложить их вместе.

&Array[withThisPosition]

Значительно получает адрес элемента на withThisPosition в массиве Array. Если вы решили, вы могли бы написать это как: Array+withThisPosition вместо.

(WORD *)

Это говорит, что нужно взять все, что идет после него (бит выше), и рассматривать это как указатель на WORD.

Первоначальный *, затем говорит разыменовать этот указатель - то есть посмотреть на что бы он ни указывал.

В целом, это поиск позиции (withThisPosition) в Array, просмотр WORD по этому адресу и присвоение значения этого слова ThisThing.

1 голос
/ 10 февраля 2010

C имеет важную и мощную концепцию указателей . Вы должны действительно узнать о них - хороший учебник доступен здесь .

Если ptr - указатель, тогда *ptr - это значение, на которое он указывает.

0 голосов
/ 10 февраля 2010

В вашем выражении есть несколько несовпадающих паренов. Я предполагаю, что вы имели в виду:

ThisThing = *((WORD *) &Array[withThisPosition]);

The

(WORD *) &Array[withThisPosition]

часть имеет указатель типа на WORD. Ведущий * задерживает указатель. Так

*((WORD *) &Array[withThisPosition])

имеет тип WORD.

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