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

Ваш аккаунт

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

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

Подписчиков: -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 первые приведенные конструкции. :)
Страницы:
242
31 июля 2007 года
Оlga
2.2K / / 04.02.2006
A у тебя какой компилер? Нормальный такое компилить не должен:
 
Код:
char *name = "Vitka";
char * - это указатель на один символ, полный изврат приписывать ему массив символов, т.е. память выделяется под один символ и все.
char [] - выделение памяти под массив символов с заранее известным(до компиляции) размером. Когда пишем:
 
Код:
char name[] = "Vitka";
размер берется от кол-ва символов в строке плюс один для обозначения конца строки, а если добавляем const - это говорит, что данную переменную(ее значение/я) нельзя изменять).

Общее между указателем на единичный символ и массивом то, что и то и другое реализовано через указатели.

ЗЫ правда я говорю о С, но должно быть индентично.
361
31 июля 2007 года
Odissey_
661 / / 19.09.2006
В моей голове похожее представление.
В первом случае
 
Код:
char *name = "Vitka";

в статичексой памяти выделяется место для строковой переменной и указатель инициализируется адресом этой строки.
Во втором случае
 
Код:
char name[] = "Vitka";

компилятор выделяет место под 6 символов в динамической памяти для указателя.
242
31 июля 2007 года
Оlga
2.2K / / 04.02.2006
Цитата:
в статичексой памяти выделяется место для строковой переменной и указатель инициализируется адресом этой строки.


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

3.3K
01 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата:
Нормальный такое компилить не должен:
 
Код:
char *name = "Vitka";


ДА ЭТА КОНСТРУКЦИЯ ИСПОЛЬЗУЕТСЯ И КОРРЕКТНО РАБОТАЕТ С НЕЗАПАМЯТНЫХ ВРЕМЁН!!! Я УБИТ НАПОВАЛ.:confused:

6.5K
01 августа 2007 года
viTTas
20 / / 02.04.2005
Ээ... Значит изменять данные в статической памяти нельзя? =)
255
01 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: ShadyMan
ДА ЭТА КОНСТРУКЦИЯ ИСПОЛЬЗУЕТСЯ И КОРРЕКТНО РАБОТАЕТ С НЕЗАПАМЯТНЫХ ВРЕМЁН!!! Я УБИТ НАПОВАЛ.:confused:


Оно то может и работать и не работать.. Это ж явно небезопасный код. А работает такая конструкция только если строка не затрет другие данные, или код.. Поправьте, если ошибаюсь =)
Я бы писал либо второй вариант, либо так:

 
Код:
char * name;
name = new char [6];
name = "Vitka\0";
.....
/// Working with variable name
...
delete [] name;
361
01 августа 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
Оно то может и работать и не работать.. Это ж явно небезопасный код. А работает такая конструкция только если строка не затрет другие данные, или код.. Поправьте, если ошибаюсь =)


Да нет. Чем он не безопасен? Компилятор точно знает размер строки, так что такое определение вполне нормально

 
Код:
const char* message = "Hello world!";


Цитата:
Ээ... Значит изменять данные в статической памяти нельзя? =)


Почему нельзя? можно.
Просто у тебя же там константная строка.

240
01 августа 2007 года
aks
2.5K / / 14.07.2006
Цитата: Dart Bobr
Оно то может и работать и не работать.. Это ж явно небезопасный код. А работает такая конструкция только если строка не затрет другие данные, или код.. Поправьте, если ошибаюсь =)
Я бы писал либо второй вариант, либо так:
 
Код:
char * name;
name = new char [6];
name = "Vitka\0";
.....
/// Working with variable name
...
delete [] name;


=))) Вот как раз твой вариант куда более небезопасный, плюс ведет к утечке памяти.
Вот смотри что ты делаешь, сначала выделяешь память под 6 char-ов, и присваиваешь указатель на эту память в name. Потом в name ты суешь другой указатель на строковую константу (кстати накой там '\0' в конце, когда строковые константы итак прекрасно вставляют ноль на конце) при этом указатель на выделенную тобой ранее пямять безвозвратно теряется. После этого ты пытаешь отчистить память где распологается эта строковая константа по новому указателю на него, рискуя схлопотать access violation =)

А вот вариант с константным указателем, который ты критикуешь, вполне нормален. Указатель инициализируется той строкой, и если его так же неккорректно не удалять - все будет нормально =)

6.5K
01 августа 2007 года
viTTas
20 / / 02.04.2005
Цитата: Odissey_
Почему нельзя? можно.
Просто у тебя же там константная строка.



Вот в это я не въезжаю. :confused:

255
01 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
сорри, исправляю
 
Код:
char * name;
name = new char [6];
memcpy(name, "Vitka\0",6);
.....
/// Working with variable name
...
delete [] name;
320
01 августа 2007 года
m_Valery
1.0K / / 08.01.2007
Смотрим первоисточник,а именно Бьерн Страуструп "Язык программирования С++.Специальное издание" стр.130.
[QUOTE=Бьерн Страуструп]...
Строковым литералом называется последовательность символов, заключенная в двойные
кавычки :
"Это строка"
В строковом литерале на один символ больше,чем используется при записи; он всегда заканчивается нулевым символом '\0',значение которого равно 0.Например :
sizeof("Бор") == 4
Тип строкового литерала есть "массив с надлежащим количеством константных символов";таким образом "Бор" принадлежит типу const
char[4].Строковый литерал можно присвоить переменной типа char*.Это разрешается потому что в
предыдущих определениях С и С++ типом строкового литерала был char*.Благодаря такому разрешению миллионы строк кода С и С++ остаются синтаксически корректными.Однако изменения строкового литерала через такой указатель является ошибкой :
void f()
{
char* p = "Платон";
p[4] = 'e'; // ошибка : присваивание константе;
// результат не определен
}
Такого рода ошибки,как правило,не могут быть выявлены до выполнения программы.Кроме того,различные реализации по разному относятся к нарушению этого правила.То,что строковые литералы являются константами,не только является очевидным,но и позволяет при реализации произвести значительную оптимизацию методов хранения и доступа к строковым литералам...
[/QUOTE]
3
02 августа 2007 года
Green
4.8K / / 20.01.2000
Dart Bobr прав на счет небезопасности такой конструкции, как уже цитатой подтвердил m_Valery.
Как сказано в цитате, строковый литерал - это константный массив, т.о. запись
char* name = "Vitka";
представляет собой неявное преобразование типов
char* name = const char[];
что само по себе опасно.
Как сказано все в той же цитате, это рудимент оставшийся от языка С.
Я рекомендую всегда писать так:
const char* name = "Vitka";

Что же касается разницы между записью
const char *name = "Vitka";
и
const char name[] = "Vitka";
то для программиста С++ основная разница в том, что первый вариант - это указатель, а во втором - массив. И это РАЗНЫЕ ТИПЫ. Частой ошибкой начинающих является путаницей между массивом и указателем на первый элемент. Это принципиально разные вещи, хотя тип массив неявно приводится к типу указатель.
240
02 августа 2007 года
aks
2.5K / / 14.07.2006
Цитата: Green
Dart Bobr прав на счет небезопасности такой конструкции


Ну я так понял с dart Bobr-ом мы уже вовсю обсуждали const char*
Или я не прав?

3.3K
02 августа 2007 года
ShadyMan
191 / / 15.07.2006
Что в данном случае правильнее писать const char*, а не char*, язык не повернётся поспорить. Но согласитесь, что это
Цитата: Dart Bobr
сорри, исправляю
 
Код:
char * name;
name = new char [6];
memcpy(name, "Vitka\0",6);
.....
/// Working with variable name
...
delete [] name;


очередная чушь. Опять ненужный ноль в конце строки, и снова дважды выделяется память под одну и ту же строку.

361
03 августа 2007 года
Odissey_
661 / / 19.09.2006
Цитата: OlgaKr
Если нетрудно, объясни пожалуйста, в чем же принципиальная разница? Как реализован тип массив? Я считала, что так же через указатели. Что то вроде: имя массива - адрес начала массива(как указатель), а при помощи индексов высчитываем относительный адрес. Используя первый вариант с указателем мы также можем добавить квадратные скобки и индексацию и разницы в работе с ними вообще не будет.



Массивы очень похожи на указатели. Но отличия, все же есть.
Для элементов массива в с++ будут вызываться конструкторы при создании и деструкторы при уничтожении массива.
Потом...
пусть у нас есть одномерный массив b[x], по сути мы можем придумать ему какую-то замену посредством указателя - *(b+i*size).
Попробуем создайть двумерный массив b[x][y].
когда мы используем массив, нам не надо беспокоится, при доступе к корректному элементу, о его размерностях... а при аналогичном доступе посредством указателя - доступ к b[2][3] будет таким = *(b+2*(y+1)*size+3*size). То есть вместе с указателем вам придется таскать за собой еще и размерность массива. Так что так просто добавить квадратные скобки к указателю для организации многомерного массива ИМХО не получиться.
Вроде так.
//++ да, и еще наверно стоит упомянуть, что массив это всегда однородные объекты

Цитата:
и снова дважды выделяется память


та где? =)

240
03 августа 2007 года
aks
2.5K / / 14.07.2006
Цитата: ShadyMan
и снова дважды выделяется память под одну и ту же строку.


Да, где там дважды то память выделяется? Или имеешь ввиду то, что под "Vitka\0" тоже будет выделенна память? ну так от этого никуда не деться в таком подходе. )
А вот ноль в конце и правда ненужен.

3
03 августа 2007 года
Green
4.8K / / 20.01.2000
По поводу принципиальной разницы между массивами и указателями.

Язык С++ очень сильно завязан на типы. Менее высокоуровневые языки, например С, не сильно завязан на типы. Более высокоуровневые, например Python, осуществляют многую работу с типами автоматически и поэтому там тоже не сильно задумываешься о типах.
Язык же С++ требует от программиста аккуратного самостоятельного оперирования типами. Такая типизация языка является мощным инструментом, за что мне и нравится С++. Но как любой мощный инструмент в руках неумелого пользователя... :)
Я уже не раз говорил о типовой безопасности,- наборе элементарных правил такого оперирования. Вот почему мне так не нравится void* (потеря инф. типе).
В чем выражается такая типизация? В перегрузке функций и операторов, в шаблонах, в виртуализации и в интересных механизмах, которые появляются при использовании их совокупности. Тот кто читал Александреску, тот поймет, о чем я.

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

Надеюсь, я понятно объяснил... :)
А то все слишком абстрактно получилось, но могу показать примерами. Просто надо много примеров приводить, так что буду приводить по мере поступления вопросов.
361
03 августа 2007 года
Odissey_
661 / / 19.09.2006
Ок, раз уж тут лекция. Интересует вопрос про типизацию.
Возможен ли полиморфизм для элементов хранящихся в массиве?
Я так понимаю что возможен? Ведь массив хранит информацию о типе.
Но тогда получатется неоднородный массив? Или нет?
Можно осветить этот вопрос.
255
03 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
Хм, вопрос действительно интересный. Самому бы хотелось узнать ответ. Точно знаю, что на С# такое возможно, и даже сам так делал, но для плюсов не знаю.
255
03 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: aks
Да, где там дважды то память выделяется? Или имеешь ввиду то, что под "Vitka\0" тоже будет выделенна память? ну так от этого никуда не деться в таком подходе. )
А вот ноль в конце и правда ненужен.


Ну деться то можно - заполняя посимвольно массив. Но это, имхо, быцтво. =)

240
03 августа 2007 года
aks
2.5K / / 14.07.2006
Я имею ввиду когда ты вот так куда то передаешь строковы литерал.
А вместо заполнения можно сразу и инициализировать им, как уже обсуждалось.
3
03 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: Odissey_
Ок, раз уж тут лекция. Интересует вопрос про типизацию.
Возможен ли полиморфизм для элементов хранящихся в массиве?
Я так понимаю что возможен? Ведь массив хранит информацию о типе.
Но тогда получатется неоднородный массив? Или нет?
Можно осветить этот вопрос.


Прошу обратить внимание я сказал, что массив содержит "информацию о типе элементов массива", а не о типах, т.е. все элементы массива однотипные.
Но! Вспомним, что такое полиморфизм (Wikipedia):

Цитата:

Полиморфи́зм (в языках программирования) — взаимозаменяемость объектов с одинаковым интерфейсом.


Т.о. достаточно хранить в массиве объекты с однотипным интерфейсом.
Это реализуется в С++ с помощью указателей или ссылок.
Т.е. мы должны хранить в массиве указатели или ссылки на базовый класс, ссылающиеся на экземпляры производных классов.

240
03 августа 2007 года
aks
2.5K / / 14.07.2006
Цитата: Odissey_
Ок, раз уж тут лекция. Интересует вопрос про типизацию.
Возможен ли полиморфизм для элементов хранящихся в массиве?
Я так понимаю что возможен? Ведь массив хранит информацию о типе.


Да возможен. А почему неоднородный - в итоге же там хранится указатель на базовый тип. А уже исходя из этого указателя и механизм полиморфизма проявляется.

3.3K
03 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: aks
Да, где там дважды то память выделяется? Или имеешь ввиду то, что под "Vitka\0" тоже будет выделенна память? ну так от этого никуда не деться в таком подходе. )



Да, именно это и имею в виду. А почему никуда не деться? Написать по-человечески const char *szName="Vitka" и всё. Зачем что-то куда-то копировать ещё?

276
03 августа 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: ShadyMan
Да, именно это и имею в виду. А почему никуда не деться? Написать по-человечески const char *szName="Vitka" и всё. Зачем что-то куда-то копировать ещё?


Насколько я понимаю константа "Vitka" зашивается в екзешник, а при виполнении операции = она всеровно копируется в память по адресу szName. По любому двох екземплярах получится. Или я не прав ?

3.3K
03 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Rebbit
Насколько я понимаю константа "Vitka" зашивается в екзешник, а при виполнении операции = она всеровно копируется в память по адресу szName. По любому двох екземплярах получится. Или я не прав ?



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

255
03 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: ShadyMan
Да, именно это и имею в виду. А почему никуда не деться? Написать по-человечески const char *szName="Vitka" и всё. Зачем что-то куда-то копировать ещё?


Для того, что-бы иметь возможность изменить значение по адресу szName.

255
03 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
Цитата: Rebbit
Насколько я понимаю константа "Vitka" зашивается в екзешник, а при виполнении операции = она всеровно копируется в память по адресу szName. По любому двох екземплярах получится. Или я не прав ?


Если ты напишешь char *szName="Vitka", то в одном. Компилятор в памяти выделит память под массив символов, а потом присвоит его адрес указателю szName. Но, это будет массив констант. Если писать как я приводил - то в памяти строка будет 2 раза. Один раз по адресу, который грубо говоря выберет компилятор, а второй по адресу в переменной name.

3.3K
03 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Dart Bobr
Для того, что-бы иметь возможность изменить значение по адресу szName.



Я чего-то не догоняю? Где автор темы писал, что ему нужно что-то менять в строке с именем?

255
03 августа 2007 года
Dart Bobr
1.4K / / 09.04.2004
привожу цитату:
Цитата:

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

260
03 августа 2007 года
Ramon
1.1K / / 16.08.2003
Показываю на пальцах, выводы делаем сами.

Код:
int main()
{
    char* pName = "Suxx1";
    const char* pName2 = "Suxx2";
    const char* const pName3 = "Suxx3";

    char pName4[] = "Suxx4";
    const char pName5[] = "Suxx5";
   
    return 0;
}


Код:
.text:004113A8                 mov     [ebp+var_C], offset aSuxx1 ; "Suxx1"
.text:004113AF                 mov     [ebp+var_18], offset aSuxx2 ; "Suxx2"
.text:004113B6                 mov     [ebp+var_24], offset aSuxx3 ; "Suxx3"
.text:004113BD                 mov     eax, dword ptr ds:aSuxx_0 ; "Suxx"
.text:004113C2                 mov     [ebp+var_34], eax
.text:004113C5                 mov     cx, word ptr ds:a4 ; "4"
.text:004113CC                 mov     [ebp+var_30], cx
.text:004113D0                 mov     eax, dword ptr ds:aSuxx ; "Suxx"
.text:004113D5                 mov     [ebp+var_44], eax
.text:004113D8                 mov     cx, word ptr ds:a5 ; "5"
.text:004113DF                 mov     [ebp+var_40], cx

...

.rdata:0041563C aSuxx           db 'Suxx'               ; DATA XREF: main+50r
.rdata:00415640 a5              db '5',0                ; DATA XREF: main+58r
.rdata:00415642                 align 4
.rdata:00415644 aSuxx_0         db 'Suxx'               ; DATA XREF: main+3Dr
.rdata:00415648 a4              db '4',0                ; DATA XREF: main+45r
.rdata:0041564A                 align 4
.rdata:0041564C aSuxx3          db 'Suxx3',0            ; DATA XREF: main+36o
.rdata:00415652                 align 4
.rdata:00415654 aSuxx2          db 'Suxx2',0            ; DATA XREF: main+2Fo
.rdata:0041565A                 align 4
.rdata:0041565C aSuxx1          db 'Suxx1',0            ; DATA XREF: main+28o


PS: И так поступят практически все компилеры.
9.7K
03 августа 2007 года
DaemonDZK
59 / / 08.11.2005
 
Код:
char *name = "Vitka";

и
 
Код:
char name[] = "Vitka"

абсолютно идентичны с точки зрения компилятора, более того
 
Код:
char name[] = "Vitka"

всегда приводиться к
 
Код:
char *name = "Vitka";

поэтому разница только в удобстве для програмиста. в обоих случаях name - указатель на первый символ строки а запись char name[] всего лишь алтернатива char *name.
276
03 августа 2007 года
Rebbit
1.1K / / 01.08.2005
Цитата: DaemonDZK
 
Код:
char *name = "Vitka";

и
 
Код:
char name[] = "Vitka"

абсолютно идентичны с точки зрения компилятора, более того
 
Код:
char name[] = "Vitka"

всегда приводиться к
 
Код:
char *name = "Vitka";

поэтому разница только в удобстве для програмиста.



Ты предыдущий пост смотрел ? Или скажеш что Ramon етот асмовский код руками настучал ? :)

350
04 августа 2007 года
cheburator
589 / / 01.06.2006
Я не все посты читал, так что не обессудьте, если повторюсь.
Массив аналогичен указателю во всем, кроме константности.
Запись
char name[] = "Vitka"
приводит к созданию константного указателя, т. е. указателя, который нельзя "перевести" на другой объект (строку, в данном случае).
Запись же
char *name = "Vitka"
приводит к созданию указателя, который изначально указывает на строку "Vitka", но этому указателю можно назначить другой адрес, и он станет указывать на другую строку.
Кстати, сама строка в обоих случаях неконстантна, т. е. можно изменять ее содержимое.
Просьба не путать константность содержимого строки с константностью указателя на нее.
Пример.
 
Код:
char *name = "Vitka";
name = "Bulat"; // Нормально
char name1[] = "Vitka";
name1 = "Bulat";  // Ошибка компиляции
3
04 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: cheburator
Я не все посты читал, так что не обессудьте, если повторюсь.
Массив аналогичен указателю во всем, кроме константности.


Цитата: DaemonDZK

абсолютно идентичны с точки зрения компилятора, более того
поэтому разница только в удобстве для програмиста. в обоих случаях name - указатель на первый символ строки а запись char name[] всего лишь алтернатива char *name.



А вы мой пост почитайте и подумайте: во всем ли и аналогичен ли вообще, идентичны записи или нет.

9.7K
04 августа 2007 года
DaemonDZK
59 / / 08.11.2005
Цитата: Green
А вы мой пост почитайте и подумайте: во всем ли и аналогичен ли вообще, идентичны записи или нет.



Почитал, в принципе со всем согласен, за одним маленьким исключением. Не массив как тип хранит информацию о своем размере, а компилятор, для контроля границ на этапе компиляции, там где это возможно. Если бы все, что ты говоришь, было бы правдой то массивы в c/c++ контролировали бы границы при исполнении. Приводить ассемблерный код здесь все таки не стоит, он будет слишком разный у разных компиляторов, на разных уровнях оптимизации.

260
04 августа 2007 года
Ramon
1.1K / / 16.08.2003
[QUOTE=DaemonDZK]Приводить ассемблерный код здесь все таки не стоит, он будет слишком разный у разных компиляторов, на разных уровнях оптимизации.[/QUOTE]
Значит вы ничего не поняли. Посмотрите еще раз и подумайте.

PS: А код, генерируемый практически любым компилером останется примерно таким, как приведенный выше, при любых уровнях оптимизациях, не считая случая выкидывания неиспользуемого кода и данных, с отличиями по используемым регистрам и в 2х случаях из приведенных 5и будут отличия генерируемого кода при иной длине строки. Так что "слишком" это сильно сказано. Не верите - проверьте.
3
04 августа 2007 года
Green
4.8K / / 20.01.2000
Цитата: DaemonDZK
Почитал, в принципе со всем согласен, за одним маленьким исключением. Не массив как тип хранит информацию о своем размере, а компилятор, для контроля границ на этапе компиляции, там где это возможно. Если бы все, что ты говоришь, было бы правдой то массивы в c/c++ контролировали бы границы при исполнении.


М-да...
Нифига то ты не понял.
Что значит "хранит" информацию о своем размере?
При чем тут размер массива и его границы?
Компилятор контролирует границы? Это как?
При чем тут вообще компилятор? Я говорю о языке программирования.
Опять же, при чем тут контроль границ при исполнении?
При чем тут вообще время исполнения?

6.5K
04 августа 2007 года
viTTas
20 / / 02.04.2005
Эхх ребятки, я тогда ща книженцию куплю там все прочитаю, а тот тут хз что получается. (-;
3.3K
04 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: viTTas
Эхх ребятки, я тогда ща книженцию куплю там все прочитаю, а тот тут хз что получается. (-;


Во-во! Первая здравая мысль в теме. :-)
[QUOTE=Green]Нифига то ты не понял.
Что значит "хранит" информацию о своем размере?
При чем тут размер массива и его границы?
Компилятор контролирует границы? Это как?
При чем тут вообще компилятор? Я говорю о языке программирования.
Опять же, при чем тут контроль границ при исполнении?
При чем тут вообще время исполнения?[/QUOTE]
А ведь DaemonDZK абсолютно прав. То, что массив хранит информацию о количестве элементов в нём, в языках, производных от С, имеет очень маленькое значение. Ошибка "out of bounds" выдаётся лишь в случае индекса-константы. Все мы хорошо знаем, что чаще для этого используется переменная, значение которой известно лишь во время исполнения, о чём совершенно справедливо говорит DaemonDZK. Чего ты, Green, брызгаешь слюной, совершенно не понятно.

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