2015-10-04 2 views
-1

Я прочитал некоторые вопросы и не нашел то, что искал. Вот пример типажей (я видел его в каком-то видео)Не понимаю приведение типов в C

int s = 45; 
    double d = *(double *) &s; 

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

int s = 45; 
    double d = (double) &s; 

или это

int s = 45; 
    double d = (double) s; 
+0

Ну, второй результат в 45. Первый может привести к нарушению прав доступа, так как двойной в два раза шире, чем int на большинстве систем. – Mitch

+1

@Mitch Второе не обязательно приводит к 45 вообще. – orlp

+0

Нет, это не так. Я неправильно читаю его как (double) s. Виноват. – Mitch

ответ

0

В этом примере:

int s = 45; 
double d = (double) &s; 

Берешь адрес s с помощью & operator и отливать сам адрес для double

В первом случае:

int s = 45; 
double d = *(double *) &s; 

Вы берете адрес s с помощью & operator, чем вы обратитесь к этому адресу, как если бы он указал двойной (double *) &s

Теперь у вас есть указатель на double, который находится по тому же адресу, где находится ваш int.

с помощью * оператора взять значение в этом двойного указателя.

Обратите внимание, что литье происходит до отмены ссылки! как если бы это было:

int s = 45; 
double d = *((double *) &s); 

Мы можем разделить на линии для того, чтобы легче понять:

int s = 45; 
unsigned int addressOfS = &s; 
double* pointerToTheSameNumAsPointerToDouble = (double*)addressOfS; 
double theValueInThatPointer = *pointerToTheSameNumAsPointerToDouble; 
0

(double *) &s означает, что мы литейные адрес памяти s как указатель двойной (с s на самом деле двойной).

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

Например:

char s = 'c'; 
char *s_pointer = (char *)&s; 

int t = 1; 
int *t_pointer = (int *)&t; 

и т.д., и т.д.

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