Приведение типа указатель / адрес - PullRequest
14 голосов
/ 29 апреля 2010

У меня есть следующие переменные:

char *p;
int l=65;

Почему не удается выполнить приведение следующих типов?

(int *)p=&l;

и

p=&((char) l);

Ответы [ 5 ]

22 голосов
/ 29 апреля 2010

Результатом преобразования типа всегда является rvalue . Rvalue нельзя присвоить, поэтому ваше первое выражение не компилируется. Rvalue не может быть взят по адресу, поэтому ваше второе выражение не компилируется.

Чтобы выполнить правильное преобразование типов, вам необходимо выполнить следующее:

p = (char *) &l;

Это правильный способ сделать то, что вы пытались сделать во втором выражении. Он преобразует указатель int * в тип char *.

Ваше первое выражение не подлежит восстановлению. Вы можете сделать

*(int **) &p = &l;  

но в конце концов это не преобразование , а реинтерпретация памяти, занятой указателем char * как указателя int * Это уродливый незаконный взлом, который в большинстве случаев имеет очень мало практической ценности.

6 голосов
/ 29 апреля 2010

Правильный способ сделать это будет:

int I = 65;
char* p = (char*)&I;

&I дает вам int*, который указывает на I; затем вы приводите его к char* и назначаете его p.

Обратите внимание, что вы не должны обычно приводить между указателями не связанных типов. char* может использоваться для доступа к любому объекту, поэтому в данном конкретном случае это безопасно.

3 голосов
/ 29 апреля 2010

(int *) p = & l;

Строка выше не работает, потому что, как только вы приведете p к (int*), результат анонимныйвременный объект, который является rvalue , а не lvalue ;следовательно, результат не может получить назначение, и даже если язык позволил это сделать, вы бы присваивали временно отлитую копию p, а не оригиналу p.

p = & ((char) l);

Строка выше не работает по аналогичной причине;результат (char) l является временным объектом, который является копией l, приведенной к типу char.Следовательно, поскольку он временный, вы не можете взять его адрес.

Insead, вы можете использовать:

p = (char*) &l
0 голосов
/ 29 апреля 2010

Проблема заключается в том, что когда вы выполняете приведение типов (кроме того, хорошая идея или нет), заключается в том, что выражение приведение приводит к значению r.

r-значения не могут быть назначены или получены их адреса.

0 голосов
/ 29 апреля 2010

В простом C, который не так уж строг к преобразованиям типов, этот код компилируется и фактически работает. На компиляторе C ++ это фактически потребовало бы явных приведений, как уже упоминалось (см. Другие ответы).

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