Здравствуйте Nikto, Вы писали:
N>Здравствуйте pokutan, Вы писали:
P>>Вопрос к знатокам "С" — имеется код: P>>char *s = {...}. P>>Вместо "..." — что-то, неважно — что. Что бы это значило?
N>char *s — это массив, т.е. эта запись равносильна записи char s[]. Массивы ты ведь можешь инициализировать ч/з {}, верно?
char* это, конечно же НЕ массив
под массив выделяется столько памяти, сколько закажешь, а под char* 4 байта
Поэтому вопрос совершенно законный.
Я всегда считал, что писать char* s="Some text" можно и представляю себе это так:
строка "Some text" набита в программе, она часть программы и грузится в память
вместе с программой. Так что написана просто инициализация указателя.
Но вот ПИСАТЬ по такому указателю крайне не рекомендуется.
Поэтому, конечно, правильно LPCTSTR *s="Some text"
Здравствуйте Pushkin, Вы писали:
P>char* это, конечно же НЕ массив
М...да... И обращаться к s таким образом конечно же тоже нельзя: s[1],s[0]... . Почитай Гербердта Шилдта. У него даже по-моему отдельная глава есть которая называется "Взаиомосвязь указателей и массивов"...
Хотел еще чуть чуть покомментировать на счет массивов.. но настроение хорошее, сорри .
Здравствуйте Pushkin, Вы писали:
P>char* это, конечно же НЕ массив P>под массив выделяется столько памяти, сколько закажешь, а под char* 4 байта
Это правильно
P>Поэтому вопрос совершенно законный. P>Я всегда считал, что писать char* s="Some text" можно и представляю себе это так: P>строка "Some text" набита в программе, она часть программы и грузится в память P>вместе с программой. Так что написана просто инициализация указателя. P>Но вот ПИСАТЬ по такому указателю крайне не рекомендуется.
А в виндах и не получится, т.к. такие строки помещаются в защищенную от записи область памяти, a s — просто указывает на первый символ в этой строке.
P>Поэтому, конечно, правильно LPCTSTR *s="Some text"
Неправильно — "Some text" — это char[], a LPCTSTR* — это const char**, а char[] к const char** преобразовать нельзя.Поэтому вполне правильно писать:
Здравствуйте pokutan, Вы писали:
P>Вопрос к знатокам "С" — имеется код: P>char *s = {...}. P>Вместо "..." — что-то, неважно — что. Что бы это значило?
И в С и в С++ это означает то же самое, что и просто
char *s = ...;
где '...' это то же самое, что было написано между фигурными скобками в исходной записи. Инициализаторы для скалярных объектов можно опционально заключать в фигурные скобки. Т.е. для скалярного типа T запись
Здравствуйте Nikto, Вы писали:
P>>char* это, конечно же НЕ массив
N>М...да... И обращаться к s таким образом конечно же тоже нельзя: s[1],s[0]... . Почитай Гербердта Шилдта. У него даже по-моему отдельная глава есть которая называется "Взаиомосвязь указателей и массивов"...
Во-первых, вот уж кого не стоит читать по этому вопросу, так это Шилдта. Такой бредятины, какую можно увидеть в его книгах, я больше нигде не видел.
Во-вторых, от того что к чему-то можно применить оператор '[]', не делает это что-то массивом.
В-третьих, 'char*' это действительно не массив. Это указатель. Не надо путать массивы и указатели.
Здравствуйте Nikto, Вы писали:
N>Здравствуйте pokutan, Вы писали:
P>>Вопрос к знатокам "С" — имеется код: P>>char *s = {...}. P>>Вместо "..." — что-то, неважно — что. Что бы это значило?
N>char *s — это массив, т.е. эта запись равносильна записи char s[]. Массивы ты ведь можешь инициализировать ч/з {}, верно?
Нет 'char*' — это не массив, это указатель.
Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Во-первых, вот уж кого не стоит читать по этому вопросу, так это Шилдта. Такой бредятины, какую можно увидеть в его книгах, я больше нигде не видел.
ИМХО отличная книга для начинающих.
АТ>Во-вторых, от того что к чему-то можно применить оператор '[]', не делает это что-то массивом.
АТ>В-третьих, 'char*' это действительно не массив. Это указатель. Не надо путать массивы и указатели.
Ну как бы тогда в философские вопросы:
1.) В С/С++ char*==char[]?
2.) Как следствие из первого а не означает ли применительно к С/С++ равенство 1 что в С/С++ МАССИВ=УКАЗАТЕЛЬ(Имеется ввиду конечно же по сути)?
АТ>Нет 'char*' — это не массив, это указатель.
АТ>Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.
Сорри, вначале ответил, потом посмотрел это сообщение. АТ> запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций.
Интересно, а в чем различия при объявлении переменных?
Здравствуйте Nikto, Вы писали:
N>Здравствуйте Андрей Тарасевич, Вы писали:
АТ>>Во-первых, вот уж кого не стоит читать по этому вопросу, так это Шилдта. Такой бредятины, какую можно увидеть в его книгах, я больше нигде не видел.
N>ИМХО отличная книга для начинающих.
Я очень часто втречаю жертв книг Шилдта в разнообразных форумах. Нет, его книги не для начинающих. Начинающих они могут очень сильно испортить. Его книги можно читать только закостеневшим спецам, в качестве упражнения на поиск ошибок.
АТ>>Во-вторых, от того что к чему-то можно применить оператор '[]', не делает это что-то массивом.
АТ>>В-третьих, 'char*' это действительно не массив. Это указатель. Не надо путать массивы и указатели.
N>Ну как бы тогда в философские вопросы: N>1.) В С/С++ char*==char[]?
Нет. Между этими типами очень мало общего. Где-нибудь в объявлении параметра функции запись 'char* a' будет эквивалентна записи 'char a[]', но это лишь исключение из правила.
N>2.) Как следствие из первого а не означает ли применительно к С/С++ равенство 1 что в С/С++ МАССИВ=УКАЗАТЕЛЬ(Имеется ввиду конечно же по сути)?
Нет, массив и указатель — вещи совершенно разной природы.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Нет 'char*' — это не массив, это указатель.
АТ>Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.
Еще один вопросик. Понятно что МАССИВ!=УКАЗАТЕЛЬ. Я имел ввиду что работа в С с массивами и указателями одинакова. На вскидку могу привести только одно различие. Массив можно инициализировать так s[b]20[/b]]. Кто нибудь знает еще различия?
Здравствуйте Nikto, Вы писали:
АТ>> запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций.
N>Интересно, а в чем различия при объявлении переменных?
Различия совершенно очевидны. Указатель — это указатель. Массив — это агрегатный объект, т.е. объект, составленный из набора однотипных элементов (подобъектов). Массив — это примерно то же самое, что и структура в языке С. Разница только в том, что в структуре подобъекты могут быть разнотипными и доступ на уровне языка осуществляется по имени. А в массиве подобъекты всегда однотипны и оступ осуществляется по индексу.
Строго говоря, вопрос о различиях звучит несколько странновато. Между ними нет практически ничего общего. Это объекты совершенно различной природы.
Здравствуйте Nikto, Вы писали:
N>Здравствуйте Андрей Тарасевич, Вы писали:
АТ>>Нет 'char*' — это не массив, это указатель.
АТ>>Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.
N>Еще один вопросик. Понятно что МАССИВ!=УКАЗАТЕЛЬ. Я имел ввиду что работа в С с массивами и указателями одинакова. На вскидку могу привести только одно различие. Массив можно инициализировать так s[b]20[/b]]. Кто нибудь знает еще различия?
Применение оператора взятия адреса '&' к массиву и указателю дает семантически совершенно разные результаты. Применение 'sizeof' к массиву и указателю дает семантически совершенно разные результаты. Это для языка С. В языка С++ таких примеров намного больше.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Применение оператора взятия адреса '&' к массиву и указателю дает семантически совершенно разные результаты. Применение 'sizeof' к массиву и указателю дает семантически совершенно разные результаты. Это для языка С. В языка С++ таких примеров намного больше.
Ага понятно. sizeof действительно работает по разному, & тоже действительно так просто не применить(только с
привидением типов).
Спасибо.
Я только не пойму — зачем все эти рассуждения, зачем приводить стандарты?...
Кто-нить удосужился проверить хоть одну свою мысль на примере, откомпилировав код?
И чтобы ошибки компилятор не выдал. И так и не нету ответа на вопрос — "Что это значит?"
Re[6]: Что бы это значило
От:
Аноним
Дата:
23.10.02 11:29
Оценка:
Здравствуйте pokutan, Вы писали:
P>Я только не пойму — зачем все эти рассуждения, зачем приводить стандарты?... P>Кто-нить удосужился проверить хоть одну свою мысль на примере, откомпилировав код? P>И чтобы ошибки компилятор не выдал. И так и не нету ответа на вопрос — "Что это значит?"
Внимательнее читай, что тебе отвечали. Ответ есть.