|
|
  |
указатели, присвоение значений |
|
|
|
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:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

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

|
вероятно, я не так понимаю как в Си все работает. по моему мнению, я объявил переменную- указатель. дальше я в нее кладу любое значение, например, Код int a; a =45; здесь же я не привожу число 45 к типу int?
|
|
|
|
|
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 кто поймет, что первое число - адрес, а второе - модификатор? да, спасибо. Более- менее прояснилось.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|