GCC взбесилси?

grayich
char *s1 и char s1[]
Виноват, ошибся - копировал и не исправил
Ошибки не исчезают с опытом - они просто умнеют
maisvendoo
Погуглил. Вот вполне разумное объяснение
всё равно непонятно
по логике указатель должен содержать именно адрес, а в случае char *s, s содержит строку а не адрес
maisvendoo
Погуглил. Вот вполне разумное объяснение
да спс, тут достаточно допытливо рассказано...
grayich
по логике указатель должен содержать именно адрес, а в случае char *s, s содержит строку а не адрес
В данном случае (char *s и char s[]) результат будет тот же самый. С указателями никогда не работал, да и в C чайник, но, насколько понимаю, в случае использования указателя больше возможностей при оперировании с данным параметром..
Ошибки не исчезают с опытом - они просто умнеют
vasek, пишут что char *s = "blablabla" является полноценным указателем на анонимный массив с присваиваемым значением
но какого тогда printf (s) печатает blablabla , а не адрес как и должен делать указатель
grayich
но какого тогда printf (s) печатает blablabla , а не адрес как и должен делать указатель
Вот что пишут на этот счет (и согласен, меня это тоже смущает и не до конца понимаю ....... просто со строками char принимаю это как аксиому)
Второй способ определения строки - это использование указателя на символ. Определение char *b; задает переменную b, которая может содержать адрес некоторого объекта. Однако в данном случае компилятор не резервирует место для хранения символов и не инициализирует переменную b конкретным значением. Когда компилятор встречает оператор вида b ="IBM PC";, он производит следующие действия. Во-первых, как и в предыдущем случае, он создает в каком-либо месте объектного модуля строку "IBM PC", за которой следует нулевой символ ('\0'). Во-вторых, он присваивает значение начального адреса этой строки (адрес символа 'I') переменной b. Функция printf("%s", b) работает так же, как и в предыдущем случае, осуществляя вывод символов до тех пор, пока не встретится заключительный нуль.
Ошибки не исчезают с опытом - они просто умнеют
Более простое объяснение можно прочитать в книге Д.Либерти "Освой самостоятельно С++ за 21 день" День 12 стр. 351 (8 издание).
Т.е. такого типа данных как массив в С/С++ не существует. Существует выделенная память, размер которой определяется базовым типом данный умноженным на количество элементов в массиве. Квадратные скобки - это оператор индексации (индексирования). Первый элемент (с индексом нуль) и ссылка на массив - это одно и тоже. (Кстати char является int - ом).
Массив задается явным образом, т.е. в квадратных скобках указывается количество элементов массива, либо каждый элемент массива инициализируется при формировании массива (в этом случае компилятор сам определяет количество элементов для резервирования памяти).
Таким образом, объявить любой массив, например char s1[], а потом присвоить ему значение нельзя. Либо сразу присваиваем литерал, либо указываем размер.
grayich
но какого тогда printf (s) печатает blablabla , а не адрес как и должен делать указатель
ну потому чо как я понял анонимный массив... чисто прога знает область памяти выделенную для него. при чем изменение не предусмотрено, ридонли
alexandr05
(Кстати char является int - ом)
как же так, у него жеж всего значения то от -128 до 127...
И где здесь противоречие? У Б. Страуструпа этот момент подробно освещен. Читать нужно в сужающих преобразованиях. Большее множество может включать в себя меньшее, но не наоборот.
А для себя можете скомпилировать простейшую программу, которая принимает со входа char '1', затем присваивает этот символ переменной int -у, затем выводит поочередно, введенный Вами char, int и int - 0x30.
 
Зарегистрироваться или войдите чтобы оставить сообщение.