|
указатели, присвоение значений |
|
|
|
Nov 12 2014, 09:44
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
объявил указатель и хочу в него записать число, но ругается при компиляции. Почему я не могу в переменную сразу записать значение? Код uint32_t *p; p = 0x40023800 + 0x1C; ругаться перестает, когда сначала приведу к типу Код uint32_t *p; p = (uint32_t *)0x40023800 + 0x1C;
|
|
|
|
|
 |
Ответов
|
Nov 12 2014, 09:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
вероятно, я не так понимаю как в Си все работает. по моему мнению, я объявил переменную- указатель. дальше я в нее кладу любое значение. например, Код int a; a =45; здесь же я не привожу число 45 к типу int?
|
|
|
|
|
Nov 12 2014, 13:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Цитата(Сергей Борщ @ Nov 12 2014, 13:52)  Хм... Дело в том, что константа 45 уже имеет тип int. И число 0x40023800 тоже имеет тип int. Поэтому его нельзя просто взять и присвоить указателю, нужно явное приведение типа. Как нельзя присвоить целое число структуре или массиву. если следовать этой логике, что все числа уже типа int, а раз мы присваиваем число в другой тип, то надо явно преобразовать к типу, то! мы же может переменной char i = 56; сделать? 56 - int, мы же не приводим ее к типу char? V_Gэто я понимаю, что увеличение указателя на 1 приведет к увеличению на int след. адреса. Мы и объявили указатель р как uint32_t. Это было заранее сделано.
|
|
|
|
|
Nov 12 2014, 13:14
|

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Цитата(Метценгерштейн @ Nov 12 2014, 23:00)  мы же может переменной char i = 56; сделать? 56 - int, мы же не приводим ее к типу char? Еще раз, указатель по сути - это не одно число, а два (адрес и размер переменной). Привести одно целое число 56 к целому же типу char по умолчанию вполне возможно, т.к. в обоих случаях это одно число. Привести же одно число к двойному без явного указания на размер невозможно. Кстати, неявные правила приведения типов - один из недостатков Си, порождающий много багов. И поэтому, в частности, в С++ имеется более строгий контроль соответствия, хотя и там возможно char i = 56Так что ваша логика-недоумение понятны вам (и мне): если в левой части стоит указатель на int32, то правую часть стоит автоматически привести к этому типу. Но хороший стиль программирования должен исключать двусмысленности. В вашем же примере: p = 0x40023800 + 0x1C кто поймет, что первое число - адрес, а второе - модификатор?
|
|
|
|
|
Nov 12 2014, 13:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079

|
Цитата(V_G @ Nov 12 2014, 16:14)  Еще раз, указатель по сути - это не одно число, а два (адрес и размер переменной). Привести одно целое число 56 к целому же типу char по умолчанию вполне возможно, т.к. в обоих случаях это одно число. Привести же одно число к двойному без явного указания на размер невозможно.
Кстати, неявные правила приведения типов - один из недостатков Си, порождающий много багов. И поэтому, в частности, в С++ имеется более строгий контроль соответствия, хотя и там возможно char i = 56
Так что ваша логика-недоумение понятны вам (и мне): если в левой части стоит указатель на int32, то правую часть стоит автоматически привести к этому типу. Но хороший стиль программирования должен исключать двусмысленности. В вашем же примере: p = 0x40023800 + 0x1C кто поймет, что первое число - адрес, а второе - модификатор? да, спасибо. Более- менее прояснилось.
|
|
|
|
Сообщений в этой теме
Метценгерштейн указатели Nov 12 2014, 09:44 andrew_b Цитата(Метценгерштейн @ Nov 12 2014, 13:4... Nov 12 2014, 09:47 Метценгерштейн вероятно, я не так понимаю как в Си все работает.
... Nov 12 2014, 09:53 megajohn Цитата(Метценгерштейн @ Nov 12 2014, 12:4... Nov 12 2014, 10:07 ViKo Цитата(Метценгерштейн @ Nov 12 2014, 12:4... Nov 12 2014, 10:44 V_G 2Метценгерштейн
В понятие указателя входит не прос... Nov 12 2014, 11:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|