2012-06-18 6 views
2

Я нашел эту строку кода в некотором коде я анализ:Указатели в C с скобкой

Mintau = (double*) malloc(FadeAll.num_paths*sizeof(double)); 

Я также нашел вопрос здесь (который был дубликатом других вопросов, он появляется), что объясняет разные синтаксис указателей, включая:

int *ptr; 
int * ptr; 
int* ptr; 

Я должен объяснить, что я полностью понимаю, что все три из указанных выше говорят то же самое. Последний из них наиболее похож на мою строку кода. Интересно, почему в этом случае двойной должен быть в скобках? Приносим извинения, если это дублированный вопрос, но я не мог найти этого.

+4

Все те же синтаксис. Пробелы несущественны. – EJP

+1

Я мало знаю о downvoting, но кто-то может объяснить, почему сообщение было приостановлено? Я вижу, что описание нисходящего потока: «Этот вопрос не показывает никаких исследований, он неясен или не полезен». Тем не менее, я искал ответ на свой вопрос и не смог его найти. Я заявил, что занимаюсь исследованиями, и думал, что я очень четко понимаю, что я искал. Ответ был полезен для меня в понимании кода, с которым я работаю. Я что-то пропустил? – TZPike05

ответ

5

Там нет никакой разницы между этими тремя декларациями:

int *ptr; 
int * ptr; 
int* ptr; 

(double*) должен быть в круглых скобках, потому что это Cast.

Почитайте о литье в этом link

Надеется, что это помогает.

+1

Спасибо за ссылку cacho – TZPike05

+0

+1 для ссылки на Википедию! : D в любое время @ TZPike05, вы можете сделать мой ответ или любой другой - как * ответ * на свой вопрос .... если у вас есть другой вопрос, более конкретный вопрос о C просто задайте другой вопрос! –

+0

Я считаю, что ваш вопрос на 100% действителен, люди, которые downvoted должны объяснить, почему они сделали это в комментариях ... –

4

Это означает отливка. Функция malloc возвращает void*. Значение (double*) отличает это значение от double*.

В C это литье бесполезно, поскольку любой тип указателя является присвоением, совместимым с void*. Но если это был C++, тогда понадобится бросок.

Там нет никакой разницы между:

int *ptr; 
int * ptr; 
int* ptr; 
+0

Спасибо, Дэвид. После просмотра бросков, это имеет смысл сейчас. Еще новичок C, ха-ха. – TZPike05

1

Это в скобках, потому что это cast, что в основном говорит компилятору, эй, вы там, рассматриваете эту часть памяти как имеющую этот тип, потому что я так говорю (кстати, это главная причина ошибок в C, кроме того несоответствие пар распределения памяти/освобождения).

В С также считается плохой формой для выдачи результата malloc, так как отливки от void * являются автоматическими. Это просто добавление кодового шума без каких-либо преимуществ.

Что касается трех типов объявлений переменных, имейте в виду, что int* a, b; очень отличается от . Я предпочитаю последнее, потому что он явно показывает привязку указателя к имени переменной, а не типу.

2

Это означает, что это отлитый от malloc() тип возврата (void *) до float *. Что такое актерский состав? http://en.wikipedia.org/wiki/Type_conversion#Explicit_type_conversion

Кстати, это очень плохая практика, чтобы вернуть значение malloc().См. Почему: Do I cast the result of malloc?

+0

Благодарим вас за эту ссылку. Это было хорошо читать – TZPike05

+0

Нет проблем. Рад, что смог помочь. –

+1

Как замечание стороны: полагаясь на неявное литье 'void *' в C, позже возникают проблемы, если вы решите перенести код на C++. –

2

(double*) является листинг; всякий раз, когда вы видите выражение вида ( имя-типа) выражения, это означает, что «интерпретировать результат выражения как значение типа имя-типа». В этом случае он говорит «интерпретировать результат malloc как указатель на double».

Обычно значения указателя одного типа (например, char *) не могут быть непосредственно отнесены к указателю переменные другого типа (например, double *), так что вы должны использовать выражение произнесения явно преобразовать значение источника к цели тип. До стандарта 1989 года malloc, calloc и realloc все возвращали значения char *, поэтому вам пришлось использовать приведение, чтобы присвоить результат другому типу указателя.

Тип void * был введен в стандарте 1989 в качестве универсального типа указателя, который может быть назначен на различные типы указателей без необходимости гипса, и *alloc функции была изменена, чтобы возвращать значения этого типа. Явное литье результата malloc сейчас считается плохой практикой.

Структура типа в выраженном выражении близко соответствует структуре типа в объявлении, просто без имени объявляемой вещи. Это, вероятно, лучше всего объясняется некоторыми примерами.

int *p объявляет p в качестве указателя на int; чтобы передать результат выражения указателю на int, вы пишете (int *). Это то же самое, что и декларация, минус идентификатор p.

Вот еще несколько примеров:

 
Declaration    Cast     Type 
-----------    ----     ---- 
int (*ap)[10]   (int (*)[10])  Pointer to 10-element array of int 
int (*f)(void)   (int (*)(void))  Pointer to function returning int 
char **p    (char **)   Pointer to pointer to char 

Так опять же, структура выражения приведения такой же, как и структура декларации, минус название вещи объявляются.

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