2011-10-18 2 views
-1

Предположим, у вас есть «void * a» и «void * ptr», которые указывают на разные адреса, определенные в вашем коде. Тогда мне было интересно, были ли эти две строки эквивалентными и функционально одинаковыми?C указатели: имеют ли они такую ​​же функциональность?

*((unsigned **)((char*)ptr+4)) = a; 

и

*((unsigned *)((char*)ptr+4)) = a; 

Второй бросает предупреждение, что «назначение делает целое число от указателя без приведения»

Кроме того, будет ли это быть такой же, как указано выше, чтобы просто делать ?:

*((char*)ptr+4) = a; 
+0

Возможный дубликат [Последняя вещь о C указателях: путают, что этот фрагмент кода будет делать?] (Http://stackoverflow.com/questions/7803116/one-last-thing-about-c-pointers- путать-о-что-это-сниппет-оф-кода-волевой г) –

ответ

6

Это не эквивалент. # 1 разрешает (char*)ptr+4 быть указателем на unsigned (*unsigned), а # 2 разрешает его unsigned.

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

# 3 разрешает то же самое с char, что также дает предупреждение.

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