Что бы это значило
От: pokutan Израиль http://pokutan.com/
Дата: 23.10.02 01:28
Оценка:
Вопрос к знатокам "С" — имеется код:
char *s = {...}.
Вместо "..." — что-то, неважно — что. Что бы это значило?
Re: Что бы это значило
От: Nikto Россия  
Дата: 23.10.02 02:45
Оценка:
Здравствуйте pokutan, Вы писали:

P>Вопрос к знатокам "С" — имеется код:

P>char *s = {...}.
P>Вместо "..." — что-то, неважно — что. Что бы это значило?

char *s — это массив, т.е. эта запись равносильна записи char s[]. Массивы ты ведь можешь инициализировать ч/з {}, верно?
Re: Что бы это значило
От: GarikTot  
Дата: 23.10.02 03:05
Оценка:
Здравствуйте pokutan, Вы писали:

P>Вопрос к знатокам "С" — имеется код:

P>char *s = {...}.
P>Вместо "..." — что-то, неважно — что. Что бы это значило?

Всё как раз зависит от того, что в скобках находится...
Re[2]: Что бы это значило
От: Pushkin Россия www.linkbit.com
Дата: 23.10.02 05:57
Оценка:
Здравствуйте 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"
Re[3]: Что бы это значило
От: Nikto Россия  
Дата: 23.10.02 06:28
Оценка:
Здравствуйте Pushkin, Вы писали:

P>char* это, конечно же НЕ массив


М...да... И обращаться к s таким образом конечно же тоже нельзя: s[1],s[0]... . Почитай Гербердта Шилдта. У него даже по-моему отдельная глава есть которая называется "Взаиомосвязь указателей и массивов"...

Хотел еще чуть чуть покомментировать на счет массивов.. но настроение хорошее, сорри .
Re[3]: Что бы это значило
От: Stanislav Kondratiev  
Дата: 23.10.02 06:35
Оценка:
Здравствуйте 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** преобразовать нельзя.Поэтому вполне правильно писать:
char* s = "Some text";

а еще лучше:
сonst char* s = "Some text";
Re: Что бы это значило
От: Андрей Тарасевич Беларусь  
Дата: 23.10.02 06:35
Оценка: 26 (3)
Здравствуйте pokutan, Вы писали:

P>Вопрос к знатокам "С" — имеется код:

P>char *s = {...}.
P>Вместо "..." — что-то, неважно — что. Что бы это значило?

И в С и в С++ это означает то же самое, что и просто

char *s = ...;


где '...' это то же самое, что было написано между фигурными скобками в исходной записи. Инициализаторы для скалярных объектов можно опционально заключать в фигурные скобки. Т.е. для скалярного типа T запись

T x = { a };


эквивалентна записи

T x = a;


(см. например 8.5/13 в стандарте языка С++)
Best regards,
Андрей Тарасевич
Re[4]: Что бы это значило
От: Андрей Тарасевич Беларусь  
Дата: 23.10.02 06:39
Оценка:
Здравствуйте Nikto, Вы писали:

P>>char* это, конечно же НЕ массив


N>М...да... И обращаться к s таким образом конечно же тоже нельзя: s[1],s[0]... . Почитай Гербердта Шилдта. У него даже по-моему отдельная глава есть которая называется "Взаиомосвязь указателей и массивов"...


Во-первых, вот уж кого не стоит читать по этому вопросу, так это Шилдта. Такой бредятины, какую можно увидеть в его книгах, я больше нигде не видел.

Во-вторых, от того что к чему-то можно применить оператор '[]', не делает это что-то массивом.

В-третьих, 'char*' это действительно не массив. Это указатель. Не надо путать массивы и указатели.
Best regards,
Андрей Тарасевич
Re[2]: Что бы это значило
От: Андрей Тарасевич Беларусь  
Дата: 23.10.02 06:43
Оценка:
Здравствуйте Nikto, Вы писали:

N>Здравствуйте pokutan, Вы писали:


P>>Вопрос к знатокам "С" — имеется код:

P>>char *s = {...}.
P>>Вместо "..." — что-то, неважно — что. Что бы это значило?

N>char *s — это массив, т.е. эта запись равносильна записи char s[]. Массивы ты ведь можешь инициализировать ч/з {}, верно?


Нет 'char*' — это не массив, это указатель.

Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.
Best regards,
Андрей Тарасевич
Re[5]: Что бы это значило
От: Nikto Россия  
Дата: 23.10.02 06:43
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Во-первых, вот уж кого не стоит читать по этому вопросу, так это Шилдта. Такой бредятины, какую можно увидеть в его книгах, я больше нигде не видел.


ИМХО отличная книга для начинающих.


АТ>Во-вторых, от того что к чему-то можно применить оператор '[]', не делает это что-то массивом.


АТ>В-третьих, 'char*' это действительно не массив. Это указатель. Не надо путать массивы и указатели.


Ну как бы тогда в философские вопросы:
1.) В С/С++ char*==char[]?
2.) Как следствие из первого а не означает ли применительно к С/С++ равенство 1 что в С/С++ МАССИВ=УКАЗАТЕЛЬ(Имеется ввиду конечно же по сути)?
Re[3]: Что бы это значило
От: Nikto Россия  
Дата: 23.10.02 06:46
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:


АТ>Нет 'char*' — это не массив, это указатель.


АТ>Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.


Сорри, вначале ответил, потом посмотрел это сообщение.
АТ> запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций.

Интересно, а в чем различия при объявлении переменных?
Re[6]: Что бы это значило
От: Андрей Тарасевич Беларусь  
Дата: 23.10.02 06:56
Оценка: 5 (1)
Здравствуйте Nikto, Вы писали:

N>Здравствуйте Андрей Тарасевич, Вы писали:


АТ>>Во-первых, вот уж кого не стоит читать по этому вопросу, так это Шилдта. Такой бредятины, какую можно увидеть в его книгах, я больше нигде не видел.


N>ИМХО отличная книга для начинающих.


Я очень часто втречаю жертв книг Шилдта в разнообразных форумах. Нет, его книги не для начинающих. Начинающих они могут очень сильно испортить. Его книги можно читать только закостеневшим спецам, в качестве упражнения на поиск ошибок.

АТ>>Во-вторых, от того что к чему-то можно применить оператор '[]', не делает это что-то массивом.


АТ>>В-третьих, 'char*' это действительно не массив. Это указатель. Не надо путать массивы и указатели.


N>Ну как бы тогда в философские вопросы:

N>1.) В С/С++ char*==char[]?

Нет. Между этими типами очень мало общего. Где-нибудь в объявлении параметра функции запись 'char* a' будет эквивалентна записи 'char a[]', но это лишь исключение из правила.

N>2.) Как следствие из первого а не означает ли применительно к С/С++ равенство 1 что в С/С++ МАССИВ=УКАЗАТЕЛЬ(Имеется ввиду конечно же по сути)?


Нет, массив и указатель — вещи совершенно разной природы.
Best regards,
Андрей Тарасевич
Re[3]: Что бы это значило
От: Nikto Россия  
Дата: 23.10.02 06:56
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Нет 'char*' — это не массив, это указатель.


АТ>Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.


Еще один вопросик. Понятно что МАССИВ!=УКАЗАТЕЛЬ. Я имел ввиду что работа в С с массивами и указателями одинакова. На вскидку могу привести только одно различие. Массив можно инициализировать так s[b]20[/b]]. Кто нибудь знает еще различия?
Re[4]: Что бы это значило
От: Андрей Тарасевич Беларусь  
Дата: 23.10.02 07:01
Оценка:
Здравствуйте Nikto, Вы писали:

АТ>> запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций.


N>Интересно, а в чем различия при объявлении переменных?


Различия совершенно очевидны. Указатель — это указатель. Массив — это агрегатный объект, т.е. объект, составленный из набора однотипных элементов (подобъектов). Массив — это примерно то же самое, что и структура в языке С. Разница только в том, что в структуре подобъекты могут быть разнотипными и доступ на уровне языка осуществляется по имени. А в массиве подобъекты всегда однотипны и оступ осуществляется по индексу.

Строго говоря, вопрос о различиях звучит несколько странновато. Между ними нет практически ничего общего. Это объекты совершенно различной природы.
Best regards,
Андрей Тарасевич
Re[4]: Что бы это значило
От: Андрей Тарасевич Беларусь  
Дата: 23.10.02 07:04
Оценка: 18 (2)
Здравствуйте Nikto, Вы писали:

N>Здравствуйте Андрей Тарасевич, Вы писали:


АТ>>Нет 'char*' — это не массив, это указатель.


АТ>>Что касается 'char []': запись 'char*' эквивалентна записи 'char []' только при обявлении параметров функций. В данном примере использован инициализатор, заключенный в фигурные скобки, что автоматически означает, что речь идет не о параметрах функций. Поэтому в данном случае запись 'char*' не имеет абсолютно ничего общего с записью 'char []'.


N>Еще один вопросик. Понятно что МАССИВ!=УКАЗАТЕЛЬ. Я имел ввиду что работа в С с массивами и указателями одинакова. На вскидку могу привести только одно различие. Массив можно инициализировать так s[b]20[/b]]. Кто нибудь знает еще различия?


Применение оператора взятия адреса '&' к массиву и указателю дает семантически совершенно разные результаты. Применение 'sizeof' к массиву и указателю дает семантически совершенно разные результаты. Это для языка С. В языка С++ таких примеров намного больше.
Best regards,
Андрей Тарасевич
Re[5]: Что бы это значило
От: Nikto Россия  
Дата: 23.10.02 07:22
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Применение оператора взятия адреса '&' к массиву и указателю дает семантически совершенно разные результаты. Применение 'sizeof' к массиву и указателю дает семантически совершенно разные результаты. Это для языка С. В языка С++ таких примеров намного больше.


Ага понятно. sizeof действительно работает по разному, & тоже действительно так просто не применить(только с
привидением типов).
Спасибо.
Re[5]: Что бы это значило
От: Nikto Россия  
Дата: 23.10.02 07:37
Оценка:
З.Ы.: Не смотря на все различия между char* и char[] , тот кто вместо констукции:
char c[256]="";

для хранения "маленьких" строк использует/использовал
char *c=NULL;
c=new char[256];
...
delete [] c;


пусть первым бросит в меня камень .
Re[5]: Что бы это значило
От: pokutan Израиль http://pokutan.com/
Дата: 23.10.02 11:02
Оценка:
Я только не пойму — зачем все эти рассуждения, зачем приводить стандарты?...
Кто-нить удосужился проверить хоть одну свою мысль на примере, откомпилировав код?
И чтобы ошибки компилятор не выдал. И так и не нету ответа на вопрос — "Что это значит?"
Re[6]: Что бы это значило
От: Аноним  
Дата: 23.10.02 11:29
Оценка:
Здравствуйте pokutan, Вы писали:

P>Я только не пойму — зачем все эти рассуждения, зачем приводить стандарты?...

P>Кто-нить удосужился проверить хоть одну свою мысль на примере, откомпилировав код?
P>И чтобы ошибки компилятор не выдал. И так и не нету ответа на вопрос — "Что это значит?"

Внимательнее читай, что тебе отвечали. Ответ есть.
Re[4]: Что бы это значило
От: Pushkin Россия www.linkbit.com
Дата: 23.10.02 13:00
Оценка:
Здравствуйте Stanislav Kondratiev, Вы писали:
P>>Поэтому, конечно, правильно LPCTSTR *s="Some text"
SK>Неправильно — правильно писать:
SK>сonst char* s = "Some text";

пардон, это рука соскочила — конечно, я имел в виду
LPCTSR s="Some text" //БЕЗ звёздочки, а это и есть 
const char* s="Some text"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.