Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

char * и char[]

6.5K
31 июля 2007 года
viTTas
20 / / 02.04.2005
Здравствуйте, дорогие знатоки С++! :)
Недавно начал изучать С++ и возник такой вопрос: почему
 
Код:
char *name = "Vitka";

не то же самое что и:
 
Код:
char name[] = "Vitka";

?
В голове появилась такая идея, что
 
Код:
char *name = "Vitka";

то же самое что и
 
Код:
const char name[] = "Vitka";

из-за того что в случае с указателем с данными массива работать нельзя.

Объясните, пожайлуста, новичку чем отличаются друг от друга 2 первые приведенные конструкции. :)
Страницы:
3
04 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: ShadyMan

А ведь DaemonDZK абсолютно прав. То, что массив хранит информацию о количестве элементов в нём, в языках, производных от С, имеет очень маленькое значение.


Просто ты не умеешь этим пользоваться.

Цитата: ShadyMan

Ошибка "out of bounds" выдаётся лишь в случае индекса-константы. Все мы хорошо знаем, что чаще для этого используется переменная, значение которой известно лишь во время исполнения, о чём совершенно справедливо говорит DaemonDZK. Чего ты, Green, брызгаешь слюной, совершенно не понятно.


Я не брызгаю слюной, а пытаюсь объяснить.
Брызгаете слюной вы, пытаясь отрицать того, чего не понимаете.
При чем тут "out of bounds" ?
При чем тут компиляторы и время исполнения?
Я говорю о языке без привязки к компилятору.
Я говорю о типизированности языка С++, даже не о массивах и указателях как таковых, они лишь частный случай.
Вы просто игнорируете типы. А точнее, видимо, не понимаете их важности в языке С++.
Наверное, единственный способ это понять - плотно поработать с шаблонами.

3.3K
04 августа 2007 года
ShadyMan
191 / / 15.07.2006
Ей-богу, Green, у тебя разорванное мышление. Извини, но я не первый раз это замечаю. Каждое предложение в посте оппонента ты воспринимаешь изолированно, без связи с другими, искусственно разрывая мысль своими коментариями. Я же тебе и пишу, почему "имеет очень маленькое значение": потому что [quote=Green]информацию о количестве элементов в массиве[/quote] можно использовать только при работе с константными индексами. А кому это надо? Что толку от этой информации, если можно написать:
 
Код:
int i=5;
char c[4];
char=0;
- и никакого сообщения об ошибке при компиляции не будет, а в процессе исполнения программы возможно её падение. Если для тебя всё это неважно, в чём тогда, ради всего святого, ты видишь смысл того, что "массив содержит информацию о количестве элементов в массиве". А потом ты опять вплотную привязываешься к своему любимому С++, отсюда и разговоры о шаблонах. Кажется, обсуждаемая проблема шире и не сводится к особенностям С++. Ты говоришь [quote=Green]не о массивах и указателях как таковых[/quote], а мы говорим именно о них.
3
05 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: ShadyMan
Ей-богу, Green, у тебя разорванное мышление. Извини, но я не первый раз это замечаю. Каждое предложение в посте оппонента ты воспринимаешь изолированно, без связи с другими, искусственно разрывая мысль своими коментариями.


Я воспринимаю мысль полностью и цельно, но комментарии даю последовательно по каждому пункту.

Цитата: ShadyMan

Я же тебе и пишу, почему "имеет очень маленькое значение": потому что можно использовать только при работе с константными индексами. А кому это надо? Что толку от этой информации, если можно написать:
 
Код:
int i=5;
char c[4];
char=0;
- и никакого сообщения об ошибке при компиляции не будет, а в процессе исполнения программы возможно её падение. Если для тебя всё это неважно, в чём тогда, ради всего святого, ты видишь смысл того, что "массив содержит информацию о количестве элементов в массиве".


По твоему и только по твоему "имеет очень маленькое значение", потому что ты не умеешь использовать эту информацию. Ты уперся в ошибку компиляции и выход за границы массива.

А смысл в том, что я могу на основе информации о типе строить различные методы обработки.

Простейшие способы использования информации типа массив:

 
Код:
char arr[5];
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) {
    ......................
}

как видишь можно использовать информацию о размере массива в памяти и размере одного элемента этого массива.

 
Код:
void func( int(&)[3] )
{
    // для массива из 3х элементов будет вызвана эта функция
}

void func( int(&)[4] )
{
    // для массива из 4х элементов будет вызвана эта функция
}

как видишь перегрузку можно осуществлять не только для "обычных" типов, то и для типов массивов и размерность массива является характеристикой его типа.

Код:
template<class T, int N>
void func(const T(&)[N]) {
    cout << "This is an array of " << N << " elements" << endl;
}

template<class T>
void func(const T&) {
    cout << "This is not array" << endl;
}

int main()
{
    int a[3];
    func(a);

    int b;
    func(b);

    return 0;
}

как видишь при использовании шаблонов можно получать и использовать информацию о размерности массива.

Более того, компилятор сам может сказать, где у тебя массив, а где указатель:
Код:
template<class T, int N>
void func(T(&)[N]) {
    cout << "This is a array of " << N << " elements" << endl;
}

template<class T>
void _func(T*) {
    cout << "This is a pointer" << endl;
}

template<class T>
void _func(T&) {
    cout << "This is not pointer" << endl;
}

template<class T>
void func(T& v) {
    _func(v);
}


int main()
{
    int a[3];
    func(a);

    int* b;
    func(b);

    int c;
    func(c);

    return 0;
}


Я объяснил тебе "что толку от этой информации" ?
Ты до сих пор считаешь, что "можно использовать только при работе с константными индексами" ?

Цитата: ShadyMan

А потом ты опять вплотную привязываешься к своему любимому С++, отсюда и разговоры о шаблонах. Кажется, обсуждаемая проблема шире и не сводится к особенностям С++. Ты говоришь , а мы говорим именно о них.


А какая проблема? Объясни.
А то вы говорите, а о чем говорите в чем проблему нашли и сами не знаете.

Ты, кстати, выдрал кусок из фразы, и начинаешь плясать во круг него.
При этом почему то не внял продолжению фразы "они лишь частный случай".
Я тоже говорю "именно о них", но с общей позиции, которую ты в упор не хочешь замечать... или не можешь... Это называется - близорукость. Попробуй отойти на некоторое расстояние, взгляни на вещи более абстрактно, и тогда многое становится столь явным, что и спорить то не о чем.

Я говорил о разности записи
const char *name = "Vitka";
и
const char name[] = "Vitka";
для программиста С++.
И что основная разница - это то, что это РАЗНЫЕ ТИПЫ.
Далее я рассказал о том в чем разница и проблемах понимания значимости типов в С++.

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

1.8K
05 августа 2007 года
igor_nf
256 / / 13.12.2006
Прочитал все посты. Хочу вернуться к разнице между char* name и char name[]. Имея в своей программе обьявление char name[], я спокойно могу получить размер массива в байтах - sizeof(name). Имея в своей программе обьявление char* name, я не могу так спокойно получить размер массива, т.к. sizeof(*name) выдаёт размер начального элемента, что вполне логично. Хотя бы поэтому можно утверждать, что char* и char[] - совершенно разные вещи.
1.8K
05 августа 2007 года
igor_nf
256 / / 13.12.2006
Цитата: cheburator

Запись char name[] = "Vitka"
приводит к созданию константного указателя, т. е. указателя, который нельзя "перевести" на другой объект (строку, в данном случае).
Запись же
char *name = "Vitka"
приводит к созданию указателя, который изначально указывает на строку "Vitka", но этому указателю можно назначить другой адрес, и он станет указывать на другую строку.
Кстати, сама строка в обоих случаях неконстантна, т. е. можно изменять ее содержимое.
 
Код:
char *name = "Vitka";
name = "Bulat"; // Нормально
char name1[] = "Vitka";
name1 = "Bulat";  // Ошибка компиляции


Насколько я понимаю, такой код недопустим, т.к. строка "Vitka" бесследно теряется в памяти после того, как name начинает указывать на другую строку. Можно поступить так:

 
Код:
char *const name = "Vitka";
260
05 августа 2007 года
Ramon
1.1K / / 16.08.2003
Цитата: igor_nf
Насколько я понимаю, такой код недопустим, т.к. строка "Vitka" бесследно теряется в памяти после того, как name начинает указывать на другую строку. Можно поступить так:
 
Код:
char *const name = "Vitka";


Ну сколько можно? Читаем посты и примеры выше.
Сама по себе строка "Vitka" уже константна и хранится в секции данных только для чтения, если компилеру не сказано хранить ее в секции для R/W данных, но это уже ересь и сего надо избегать, почему думаем сами.

 
Код:
char* const name = "Vitka";
name[0] = 'S';

Т.е. вот такое, без игр с компилером, вызовет вам "Access violation" причем при работе программы.

 
Код:
int main()
{
    char* const name = "Vitka";
    char[] name = "Vitka";

    return 0;
}

Конструкции отличаются одним маленьким нюансом, во втором случае будет создана копия строки в автоматической памяти т.е. стеке. Есть условия при которых сия копия создаваться не будет, но какие опять же думаем сами.

PS:
- А вы и пальцы за меня загибать будете?
- Ага!
1.8K
05 августа 2007 года
igor_nf
256 / / 13.12.2006
Цитата: Ramon

Сама по себе строка "Vitka" уже константна и хранится в секции данных только для чтения, если компилеру не сказано хранить ее в секции для R/W данных, но это уже ересь и сего надо избегать, почему думаем сами.


 
Код:
char *const name = "...";

А я думал, что такая конструкция создаёт константный указатель на неконстантную строку. А что, у вас другое мнение?
3.3K
05 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Green
Я воспринимаю мысль полностью и цельно, но комментарии даю последовательно по каждому пункту.

Да не было там никаких пунктов. Всё это была одна мысль. Ну да ладно, это ерунда. А по сути вот что. Наверное, твоей лекции нужно стоя поаплодировать: я о таких интересных вещах в жизни не слышал. Да только вот ведь незадача: это всё снова С++. Например то, что ты написал о шаблонах, я конечно просмотрел - только хрен что понял: не имею ни малейшего представления, что такое шаблон в программировании. :-) Так что лично на меня это не произвело впечатления, извини. Вот это - это да:

Цитата: Green
Простейшие способы использования информации типа массив:
 
Код:
char arr[5];
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) {
    ......................
}

как видишь можно использовать информацию о размере массива в памяти и размере одного элемента этого массива.

- такой код я мог бы использовать... Только зачем? Если чёрным по белому написано, что в массиве 5 элементов, почему не написать по-человечески: int i=0; i<5; i++? Может быть ты скажешь: "А вдруг понадобиться модифицировать программу и изменить количество элементов в массиве? Что же, лазить по коду и искать эту несчастную пятёрку?" - "Да нет, зачем же? Давай просто используем #define", - отвечу я. :-) Так что это меня тоже не убедило.
А вот эта фраза меня порадовала больше всего:

Цитата: Green
Не типами в основном нужны для шаблонов, а для шаблонов в основном нужны типы, т.к. типы играют большую роль и в других вещах, например перегрузках.

Очень напоминает, как меня учили немецкому языку в школе: читаешь текст, видишь знакомые слова, но смысл текста уловить нет никакой возможности. Всё время какая-то чушь получается. Зато весело. Нет, определённо, есть свои преимущества в невежестве. Но ты, Green, не расстраивайся. Наверное, это всё очень прикольно и умно. Серьёзно. :-)

260
05 августа 2007 года
Ramon
1.1K / / 16.08.2003
Цитата: igor_nf
 
Код:
char *const name = "...";

А я думал, что такая конструкция создаёт константный указатель на неконстантную строку. А что, у вас другое мнение?


А задайтесь вопросом - "А где существует та строка на которую указывает ваш константный указатель?" не в пустоте же и не в другом измерении. Как сказали бы старшие товарищи - "учим мат. часть" и начните с того, что есть программа, процесс, поток, физическая память, виртуальная память, статическая память, динамическая память и наконец указатель.

PS: Опал в осадок, больше ни одного комментария в данной теме ибо бесполезно, непонимание все возростает, ну да ничего осознание господа к вам придет позже, если конечно вы этого захотите.

3
05 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: ShadyMan
А по сути вот что. Наверное, твоей лекции нужно стоя поаплодировать: я о таких интересных вещах в жизни не слышал. Да только вот ведь незадача: это всё снова С++.


А ты о чем тут говорил? О Бейсике?
Только вот ведь незадача: раздел то по С/С++, а топик именно про С++.

Цитата: ShadyMan

Например то, что ты написал о шаблонах, я конечно просмотрел - только хрен что понял: не имею ни малейшего представления, что такое шаблон в программировании. :-) Так что лично на меня это не произвело впечатления, извини.


А я на тебя и не пытался произвести впечатления.
Ну не знаком ты с С++, что тут поделаешь... не судьба...
Только не понятно, чего ты в тему то по С++ тогда влез?
Так... для компании?

Цитата: ShadyMan

Вот это - это да: - такой код я мог бы использовать... Только зачем? Если чёрным по белому написано, что в массиве 5 элементов, почему не написать по-человечески: int i=0; i<5; i++? Может быть ты скажешь: "А вдруг понадобиться модифицировать программу и изменить количество элементов в массиве? Что же, лазить по коду и искать эту несчастную пятёрку?" - "Да нет, зачем же? Давай просто используем #define", - отвечу я. :-) Так что это меня тоже не убедило.


Ну ведь это же всего-лишь простейший пример. Сложных приводить не буду, опять "хрен поймешь".

Цитата: ShadyMan

А вот эта фраза меня порадовала больше всего:Очень напоминает, как меня учили немецкому языку в школе: читаешь текст, видишь знакомые слова, но смысл текста уловить нет никакой возможности. Всё время какая-то чушь получается. Зато весело. Нет, определённо, есть свои преимущества в невежестве. Но ты, Green, не расстраивайся. Наверное, это всё очень прикольно и умно. Серьёзно. :-)


Да я не расстраиваюсь. Мне, слава Богу, с тобой дел не иметь. Так что пользуйся своим "преимуществом" и ни в коем случае не учи С++.

2.0K
06 августа 2007 года
WidowMaker
212 / / 05.04.2005
Думал топу не будет конца...
2ShadyMan:
Не влезая в вашу дискуссию для двоих, просто хочу высказать свое скромное мнение.
Shady ты наверное поклонник исполняемых языков (интерпретируемых, скриптовых) и для тебя наверное не столь насущна проблема контроля типов и отлавливания ошибок на этапе компиляции, а ведь это каждый день спасает сотни неврных клеток (которые потом просажываются на формумах и чатах ;)) у сотен тысяч программистов.

2Green:
Опять же не влезая в вашу дискуссию...
Практически во всем согласен, а некоторые примеры даже возьму на заметку (хм (&)[], интересный контроль соответствия размера передаваемого массива...), как то раньше не задумывался так упрощать себе жизнь:D
3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
[quote=Green]а топик именно про С++.[/quote] Да? Никогда бы не подумал, что const char *name="..." - особенная черта языка С++.
[quote=Green]Так что пользуйся своим "преимуществом" и ни в коем случае не учи С++.[/quote]Угу, обязательно воспользуюсь и ещё не раз. :-) В общем, спасибо, здорово повеселил.
[quote=WidowMaker]Shady ты наверное поклонник исполняемых языков (интерпретируемых, скриптовых)[/quote]Да нет, просто на С пишу.
2.0K
06 августа 2007 года
WidowMaker
212 / / 05.04.2005
Блин, так и хочется сказать что мало пишешь...Или ты ортодокс?
3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: WidowMaker
Блин, так и хочется сказать что мало пишешь...

Честно сказать - правда, действительно, мало. Даже больше - в последнее время вообще не пишу. Но ты это к чему?

Цитата: WidowMaker
Или ты ортодокс?

А что для тебя значит быть ортодоксом в программировании?

353
06 августа 2007 года
Nixus
840 / / 04.01.2007
2ShadyMan, вопрос был задан конкретно по C++. В C и C++ отношение к типам совершенно разное, поэтому и конструкции эти в C++ отличаются типом во время компиляции. Конкретная реалиализация char* name="..."; и char name[]="..."; в откомпилированном коде может совпадать и врядли можно в C написать конструкцию, которая бы по разному воспринрмала их. Но для C++ это разные типы и, например, сигнатуры функций, использующих аргументы этих типов, будут разными.
2.0K
06 августа 2007 года
WidowMaker
212 / / 05.04.2005
Ортодокс в прогаммировании для меня - это человек для которого, НЕ зависимо от задачи, главное решение сегодняшней задачи. Написанная им программа усложнится по мере усложнения задачи или вообще перестанет существовать. Для него в вопросе производительности и ясности кода ответ всегда первое. Он может использовать различные ухищрения для работы памятью и с типами (точнее их игнорируя) не понимая уровни абстракции; например не понимая того что на данном уровне не работают с данными и памятью, а используют, к примеру, драйвер (не программный модуль, а интерфейс доступа). Такие программы сложно отлаживать и следственно модифицировать.
Если ты узнаешь себя, то наверно не понимаешь о чем я тут распинаюсь........
255
06 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
Green, спасибо за примеры.. Некоторые возьму себе на заметку.
240
06 августа 2007 года
aks
2.5K / / 14.07.2006
Цитата: Free Thinker
а если у тебя динамический массив?


Тему внимательней почитай. И ответь для себя - что такое динамический массив ))

3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Кстати, по поводу этого
Цитата: ShadyMan
Вот это - это да: - такой код я мог бы использовать... Только зачем? Если чёрным по белому написано, что в массиве 5 элементов, почему не написать по-человечески: int i=0; i<5; i++? Может быть ты скажешь: "А вдруг понадобиться модифицировать программу и изменить количество элементов в массиве? Что же, лазить по коду и искать эту несчастную пятёрку?" - "Да нет, зачем же? Давай просто используем #define", - отвечу я. :-) Так что это меня тоже не убедило.


придумал простенький пример, доступный для понимания, не только программистам С++:

 
Код:
int array[] = {1, 2, 3, 5, 76, 23};
for (int i=0; i<sizeof(array)/sizeof(array[0]); ++i) {
    ..............
}

никако #define не надо, он только усложнит код.
11K
06 августа 2007 года
Free Thinker
118 / / 16.03.2007
aks, я знаю, какая тема и знаю, что такое динамический массив. собственно это не был вопрос, а я отвечал я лично ShadyMan'у.
240
06 августа 2007 года
aks
2.5K / / 14.07.2006
Цитата: Free Thinker
aks, я знаю, какая тема и знаю, что такое динамический массив. собственно это не был вопрос, а я отвечал я лично ShadyMan'у.



Я к тому, что то что ты понимаешь скорее всего под "динамическим" массивом к данному коду уже не имеет отношения. И работать с ним так уже будет нельзя.

294
06 августа 2007 года
Plisteron
982 / / 29.08.2003
Цитата: ShadyMan
Очень напоминает, как меня учили немецкому языку в школе: читаешь текст, видишь знакомые слова, но смысл текста уловить нет никакой возможности. Всё время какая-то чушь получается. Зато весело.

Ты считаешь, что твоё незнание ставит тебя в выгодное положение?

Цитата: ShadyMan
Угу, обязательно воспользуюсь и ещё не раз. :-) В общем, спасибо, здорово повеселил.

Зря ты так. Green, конечно, бывает грубоват, но плохого не посоветует.

Цитата: ShadyMan
Да нет, просто на С пишу.

Так какого чёрта о C++ рассуждаешь? Сказано же: большое значение такое разделение типов имеет для шаблонов и перегрузки операторов и функций. Если не знаешь, что такое шаблон -- C++ в этом не виноват.

Цитата: ShadyMan
Честно сказать - правда, действительно, мало. Даже больше - в последнее время вообще не пишу. Но ты это к чему?

А это он к тому, что если начнёшь работать над большими быстро развивающимися проектами, тогда жизнь (читай: лавинообразное нарастание багов в твоей программе) заставит более внимательно относиться к советам бывалых программеров вроде Green.

11K
06 августа 2007 года
Free Thinker
118 / / 16.03.2007
Цитата: aks
Я к тому, что то что ты понимаешь скорее всего под "динамическим" массивом к данному коду уже не имеет отношения. И работать с ним так уже будет нельзя.



и что же по твоему я понимаю под "динамическим" массивом?

240
06 августа 2007 года
aks
2.5K / / 14.07.2006
Ну таки скажи нам, что ты под этим понимаешь? ))
Можно с примером. )
11K
06 августа 2007 года
Free Thinker
118 / / 16.03.2007
во первых, ты отвечаешь вопросом на вопрос.
во вторых, я действительно ошибся. этот код не выдаст размер динамического массива.
3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
Ой, ребята, столько с утра понаписали, даже и не знаю, смогу ли всем ответить. Извиняйте, если кого пропущу.
Сначала, конечно, обращаюсь к глубоко- и многоуважаемому корифею. :-)
[quote=Green]придумал простенький пример, доступный для понимания, не только программистам С++:
Код:
 
Код:
int array[] = {1, 2, 3, 5, 76, 23};
for (int i=0; i<sizeof(array)/sizeof(array[0]); ++i)
 { .............. }
никако #define не надо, он только усложнит код.[/quote] - вот это я понимаю, наконец-то первый более-менее полезный пример. Случай, конечно, редкий, но здесь преимущество массива хорошо видно. А #define тут, действительно, не причём. Кто ж спорит? Только я ведь так и сказал: имеет маленькое значение, а не не имеет его вообще. Твой пост это только подтверждает.
[quote=Plisteron]Так какого чёрта о C++ рассуждаешь? Сказано же: большое значение такое разделение типов имеет для шаблонов и перегрузки операторов и функций.[/quote]Где же это я о С++ рассуждал? Внимательнее читать надо. Я только написал, что всё описываемое Green'ом имеет значение лишь в С++, хотя обсуждаемая тема касается всех производных от С языков. Просто смешно видеть такую зашоренность. У Green'а получается так, что если только где-то слышен слог "си", то это сразу понимается как разговор о С++ и если что-то не укладывается в рамки объектно-ориентированного программирования, то значит это уже от лукавого.
2Free Thinker. А всё-таки интересно, что ты имел в виду под динамическим массивом?.
2WidowMaker. Странное какое-то у тебя понимание слова "ортодокс", прямо скажем, извращённое. Нет, такими вещами я не занимаюсь. Более того, тот же самый Green меня таки убедил где-то около полугода назад, что читабельность кода куда важнее незначительного выигрыша в производительности.
Но больше всего меня забавляют высказывания типа: "если начнёшь работать над большими быстро развивающимися проектами", "если тебя когда-нибудь возьмут в комманду программистов (что очень сомнительно)" и т. д. Да, действительно не возьмут, и не рвусь я туда, потому что не программист :-) и никогда им не стану, о чём ничуть не жалею, кстати.
3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: ShadyMan

- вот это я понимаю, наконец-то первый более-менее полезный пример.


Если точнее, это первый "более-менее полезный пример", который ты понимаешь. Т.к. остальные примеры тоже полезные, только полезности ты их, как сам и заявлял, не понимаешь.

Цитата: ShadyMan

Я только написал, что всё описываемое Green'ом имеет значение лишь в С++, хотя обсуждаемая тема касается всех производных от С языков. Просто смешно видеть такую зашоренность. У Green'а получается так, что если только где-то слышен слог "си", то это сразу понимается как разговор о С++ и если что-то не укладывается в рамки объектно-ориентированного программирования, то значит это уже от лукавого.


А по теме ты что-нибудь написал?
Смотрим топик:

Цитата: viTTas
Здравствуйте, дорогие знатоки С++! :)
Недавно начал изучать С++ и возник такой вопрос:


Наверное, двух явных указаний языка программирования явно не достаточно.

P.S. Кстати, ради смеха назови "все производные от С языки" или хотя бы несколько. И каких из них касается эта тема?

3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Green
Если точнее, это первый "более-менее полезный пример", который ты понимаешь.

Нет, неправда. Первый более-менее полезный пример, имеющий отношение к языку С. Если ты сможешь привести ещё что-то, то пожалуйста. Я думаю, каким бы пример не был сложным, но если он будет написан на С, то я пойму, что к чему.
[quote=Green]А по теме ты что-нибудь написал?
Смотрим топик:

Цитата:
Здравствуйте, дорогие знатоки С++!
Недавно начал изучать С++ и возник такой вопрос:


Наверное, двух явных указаний языка программирования явно не достаточно.[/quote]Ну, это же новичок писал. Держу пари, что он вообще не знает чётких границ между С и С++. А всё почему? Потому что такие как ты дурят голову начинающим и создают у них впечатление, как будто кроме объектно-ориентированного стиля ничего стоящего в программировании нет. Конструкции же, которые он попросил прокомментировать, вполне применимы и в "плоском" С, поэтому моё вмешательство в разговор считаю вполне правомерным.
[quote=Green]P.S. Кстати, ради смеха назови "все производные от С языки" или хотя бы несколько. И каких из них касается эта тема?[/QUOTE]Пожалуйста, смех - это хорошо. Сам люблю постебаться и против стороннего стёба ничего против не имею. Только я ж говорю: не специалист я, поэтому что бы ни сказал, мне всё будет простительно. А языки эти, вот они: С с классами, C++, C-- и С#. Насколько эта тема касается последнего из них, честно говоря, не знаю.

276
06 августа 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: ShadyMan

Ну, это же новичок писал. Держу пари, что он вообще не знает чётких границ между С и С++.


Новичек не новичек, а если такой вопрос задал то уже видно что старается понять проблему изнутри, а не то что некоторые дальше собственного носа не смотрят и ООП и шаблони ненужными считают.

Цитата:
А всё почему? Потому что такие как ты дурят голову начинающим и создают у них впечатление, как будто кроме объектно-ориентированного стиля ничего стоящего в программировании нет.

А куда он сейчас без етого стиля сунется ? Много найдеш заказов, скажем, на прологе ? Или ти думаеш что Джава и .НЕТ уже свое отжыли ?

Цитата:
Конструкции же, которые он попросил прокомментировать, вполне применимы и в "плоском" С.

Конечно он полностю отказался от С++ и сел за си потому что уверен что приемущества плюсов ему никогда не пригодятся.

3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: ShadyMan

Ну, это же новичок писал. Держу пари, что он вообще не знает чётких границ между С и С++. А всё почему? Потому что такие как ты дурят голову начинающим и создают у них впечатление, как будто кроме объектно-ориентированного стиля ничего стоящего в программировании нет. Конструкции же, которые он попросил прокомментировать, вполне применимы и в "плоском" С, поэтому моё вмешательство в разговор считаю вполне правомерным.


И что же ты высказал, вмешавшись в разговор?
Ничего. Кроме того, что я неправ, т.к. ты знаешь C, и не знаешь С++. (Потрясающий аргумент. Ты на форуме врачей-хирургов не пробовал спорить?)
Ну очень познавательная информация. Особенно для новичков, о которых ты так "печешься".
Ну так просвети, что отвечать новичкам, задающим вопрос по C++?
Наверное следущее: "Держу пари, что ты вообще не знаешь чётких границ между С и С++. Поэтому будем говорить про Basic."

Что плохого в том, что человек, в отличие от тебя, будет разбираться в языке С++?
Наверное только одно - "в отличие от тебя".

Почему бы человеку, задающему вопрос по C++, не ответить именно про C++?

Цитата: ShadyMan

А языки эти, вот они: С с классами, C++, C-- и С#. Насколько эта тема касается последнего из них, честно говоря, не знаю.


"С с классами" - это Objective C ? Ок, принимается.
C-- - IMHO, не является производным от C.
C# - однозначно не имеет никакого отношения к C.

И того остается только Objective C и С++.

3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Rebbit
Новичек не новичек, а если такой вопрос задал то уже видно что старается понять проблему изнутри, а не то что некоторые дальше собственного носа не смотрят и ООП и шаблони ненужными считают.

Снова фантазии. Где это я писал, что ООП и шаблоны - ненужные вещи?
[quote=Rebbit]А куда он сейчас без етого стиля сунется ? Много найдеш заказов, скажем, на прологе ? Или ти думаеш что Джава и .НЕТ уже свое отжыли ?
Конечно он полностю отказался от С++ и сел за си потому что уверен что приемущества плюсов ему никогда не пригодятся.[/QUOTE]Спор о преимуществах плюсов перед обычным С - спор философский. Очень жаль, что для тебя всё так очевидно. После твоей реплики надо бы сказать, что дальше собственного носа не смотришь именно ты. Достаточно заметить, что если бы преимущества С++ были признаны всеми, не было бы современных стандартов языка С и API Windows был бы тоже сплошь и рядом объектно-ориентированным (в конце концов, С++ тоже очень старый язык и за годы его существования эти самые "плюсы" должны были бы быть оценены по достоинству разработчиками ОС).

3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Green
И что же ты высказал, вмешавшись в разговор?
Ничего. Кроме того, что я неправ, т.к. ты знаешь C, и не знаешь С++.

Ты, как всегда, всё перевираешь. Ты не прав, потому что к общей теме приплёл свой С++, а обсуждались вовсе не его особенности. Вот и всё. [quote=Green]Ты на форуме врачей-хирургов не пробовал спорить?[/quote]:-))))) Ты даже не представляешь насколько близок к истине! Нет, пока не спорил, но возможно придётся. Хирургия, правда, не моя специальность, но смежная с моей.
[quote=Green]Ну очень познавательная информация. Особенно для новичков, о которых ты так "печешься".
Ну так просвети, что отвечать новичкам, задающим вопрос по C++?
Наверное следущее: "Держу пари, что ты вообще не знаешь чётких границ между С и С++. Поэтому будем говорить про Basic."[/quote]Ёрниченье чистой воды. По-моему так: спрашивают про строки - так и отвечай про строки, а если развиваешь тему, то так и пиши: вообще-то оно так-то и так-то, но вот в моём любимом-прелюбимом С++ вот так. :-) Блин, никто ж тебя ни в чём не обвиняет. Пиши, что хочешь. Но и я буду писать, что хочу, и если в чём-то буду не согласен, обязательно выскажусь, хотя бы это и не имело отношения к первоначальной теме разговора.
[quote=Green]C-- - IMHO, не является производным от C.[/quote]Странное у тебя "IMHO".
[quote=Green]C# - однозначно не имеет никакого отношения к C.[/quote]Интересно узнать, почему тогда он объединён в этой ветке с С и С++.

276
06 августа 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: ShadyMan
Снова фантазии. Где это я писал, что ООП и шаблоны - ненужные вещи?


Цитата: ShadyMan
Например то, что ты написал о шаблонах, я конечно просмотрел - только хрен что понял: не имею ни малейшего представления, что такое шаблон в программировании. :-)


Полагаю в том что человек считает нужным он старается розобраться.

Цитата: ShadyMan
Спор о преимуществах плюсов перед обычным С - спор философский. Очень жаль, что для тебя всё так очевидно.


Я не сказал что С хуже С++. К сожаленимю действительно профан в С++ и темболее в С. Приемущества С++ вижу, уверен что и в С есть свои приемущества.

11K
06 августа 2007 года
Free Thinker
118 / / 16.03.2007
ShadyMan, банальный пример:
 
Код:
int *arr = (int*)malloc(sizeof(int));
...
arr = (int*)realloc(arr, sizeof(int)*2);
3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: ShadyMan
Ты, как всегда, всё перевираешь. Ты не прав, потому что к общей теме приплёл свой С++, а обсуждались вовсе не его особенности. Вот и всё. :-)))))


Что значит "к общей теме приплел свой С++" ?
Тема была про строки в С++. Смотри топик.
А типизация - это не особенность языка С++, а его основа. Но тебе такая оплошность простительна.

Цитата: ShadyMan

Ты даже не представляешь насколько близок к истине! Нет, пока не спорил, но возможно придётся. Хирургия, правда, не моя специальность, но смежная с моей.


Тогда расскажи мне, где вы спорите. Я тоже поспорю там твоими методами.

Цитата: ShadyMan

Ёрниченье чистой воды. По-моему так: спрашивают про строки - так и отвечай про строки, а если развиваешь тему, то так и пиши: вообще-то оно так-то и так-то, но вот в моём любимом-прелюбимом С++ вот так. :-)


Спасибо за настоятельный совет.
А от куда начинать рассказывать про строки в С++?
С бейсика, с ассемблера, с явы?
Почему ты сам начал объяснять не с алгола и фортрана?

Кстати, объясни, как можно ответить про строки в С++ с точки зрения другого языка программирования? Ты сам то абсурдность своей позиции замечаешь?

Цитата: ShadyMan

Блин, никто ж тебя ни в чём не обвиняет. Пиши, что хочешь. Но и я буду писать, что хочу, и если в чём-то буду не согласен, обязательно выскажусь, хотя бы это и не имело отношения к первоначальной теме разговора.


Ну я то уже заметил, что ты любишь вписаться не в тему и высказаться не по делу.

Цитата: ShadyMan

Странное у тебя "IMHO".


Нормальное, профессиональное.

Цитата: ShadyMan

Интересно узнать, почему тогда он объединён в этой ветке с С и С++.


Не знаю, так получилось.
Ты считаешь тему форума основным доказательством происхождения C# от C? :D

3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Free Thinker
ShadyMan, банальный пример:
 
Код:
int *arr = (int*)malloc(sizeof(int));
...
arr = (int*)realloc(arr, sizeof(int)*2);


Фактически, это, конечно, динамический массив. Но сторого говоря... Я бы, наверное, назвать это динамическим массивом не решился. Интересно, что скажут корифеи.
[quote=Rebbit]Полагаю в том что человек считает нужным он старается розобраться.[/quote]А по-моему, ты неправильно полагаешь. Невозможно разобраться во всём. Я глубоко убеждён, что маркетинг, термоядерный синтез, высшая математика и многое другое - очень полезные вещи; как минимум, для тех, кто ими занимается. Я вполне допускаю, что всё это безумно интересно, но разобраться во всём этом меня что-то не тянет.

3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: ShadyMan

А по-моему, ты неправильно полагаешь. Невозможно разобраться во всём. Я глубоко убеждён, что маркетинг, термоядерный синтез, высшая математика и многое другое - очень полезные вещи; как минимум, для тех, кто ими занимается. Я вполне допускаю, что всё это безумно интересно, но разобраться во всём этом меня что-то не тянет.


Однако тянет поспорить в том, в чем разбираться не тянет. :D

3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Free Thinker
ShadyMan, банальный пример:
 
Код:
int *arr = (int*)malloc(sizeof(int));
...
arr = (int*)realloc(arr, sizeof(int)*2);


То, что ты приводишь это вызов функции выделения блока памяти определенного размера и перевыделение блока.
Это достаточно низкоуровневая операция с т.з. языка С++, которая ему досталась от С. Соотв-но ни о каких типах здесь вообще речи не идет. Просто блок памяти.

В C++ нет такого типа, как "динамический массив".

Можно создать массив элементов с помощью оператора new[], но специфика этого оператора такова, что он возвращает указатель на первый элемент массива, а не значение типа массив.
Т.е. налицо неявное приведение типов в процессе создания массива таким образом.

11K
06 августа 2007 года
Free Thinker
118 / / 16.03.2007
Цитата: ShadyMan
Фактически, это, конечно, динамический массив. Но сторого говоря... Я бы, наверное, назвать это динамическим массивом не решился. Интересно, что скажут корифеи.


контр-вопрос: а что такое динамический массив по твоему?

Цитата: Green
То, что ты приводишь это вызов функции выделения блока памяти определенного размера и перевыделение блока.


да ну!? :)

Цитата: Green

Это достаточно низкоуровневая операция с т.з. языка С++, которая ему досталась от С. Соотв-но ни о каких типах здесь вообще речи не идет. Просто блок памяти.

В C++ нет такого типа, как "динамический массив".

Можно создать массив элементов с помощью оператора new[], но специфика этого оператора такова, что он возвращает указатель на первый элемент массива, а не значение типа массив.
Т.е. налицо неявное приведение типов в процессе создания массива таким образом.



а я и приводил пример из простого С. ни о каких типах я не говорил, и то что в С++ нет такого типа, как динамический массив, знаю.

3
06 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Free Thinker

а я и приводил пример из простого С. ни о каких типах я не говорил, и то что в С++ нет такого типа, как динамический массив, знаю.


Ну так и в С нет такого типа.
Динамический массив - это, в принципе, несколько ошибочное понятие. Хотя очень расхожее.
Я тоже его употребляю, когда говорю о динамическом создании массива (именно с помощью new[]).
Но к типам или к переменным это отношения не имеет.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог