Russian Qt Forum

Программирование => С/C++ => Тема начата: lnkgyv от Июль 09, 2007, 15:10



Название: Нюанс работы с массивами
Отправлено: lnkgyv от Июль 09, 2007, 15:10
Всем привет. Занимаюсь программированием давно, закончил технарь, счас програмлю на работе с помощью Qt4. Для поддержания "спортивной" формы в С++ перечитываю литературу, бывает что нахожу что-то новое. Записался на курсы дистанционного обучения на сайте intuit.ru. Там читал про массивы внимательно. На протяжении всей лекции они утверждают, к примеру:
int a[5]={1,2,3,4,5}; // например, если написать a[5]=2, то будет ошибка, по скольку есть выход за предел массива. Я у себя пишу с помощью GCC даный фрагмент и всё на ура. насколько я понимаю после даного примера у нас фактически есть не 5 элементов а 6 в массиве. В ихних тестах к лекции я выследил, что :
Они спрашивают, как распечатать все элементы массива int a[12].
Я отвечаю for(int i=0; i<=12; i++) cout<<a;
а правильный оказывается for(int i=0; i<12; i++) cout<<a;. Согласно ихнему ответу они не печатают тринадцатый єлемент. Я в замешательстве, хотя всё достаточно просто. пожалуйста разъясните ситуацию.


Название: Нюанс работы с массивами
Отправлено: Admin от Июль 09, 2007, 16:44
Самое главное правило, все массивы в С++ начинаются с 0

int a[5]={1,2,3,4,5}; - 5 элементов в массиве
тоесть существуют a[0],...,a[4]
a[5]=2 - компилятор не ругнется - но это ошибка)


Название: Нюанс работы с массивами
Отправлено: Вудруф от Июль 10, 2007, 08:39
В массиве int a[] = {1,2,3,4,5} - 5 элементов
В массиве char a[] = "12345"; - 6 элементов (символы + \0)
Дополнительный символ появляется только в символьных массивах и только при объявлении именно строки (т.е. в кавычках).


Название: Нюанс работы с массивами
Отправлено: lnkgyv от Июль 10, 2007, 08:59
Цитата: "Admin"
Самое главное правило, все массивы в С++ начинаются с 0

int a[5]={1,2,3,4,5}; - 5 элементов в массиве
тоесть существуют a[0],...,a[4]
a[5]=2 - компилятор не ругнется - но это ошибка)

Спасибо за ответ! Хоть я и до сих пор не понимаю почему это ошибка. Я использовал на ура последний индекс. Но буду считать, что это аксиома языка С/С++ и использовать последний индекс не буду.


Название: Нюанс работы с массивами
Отправлено: kitov от Июль 10, 2007, 22:30
Это не последний индекс !!!
в массиве a[5] последний индекс 4 !!!


Название: Re: Нюанс работы с массивами
Отправлено: fightcat от Сентябрь 18, 2007, 15:46
Просто массив - это не совсем массив  ;D
Почитайте про адресную арифметику

array[n] - это указатель на начало массива (array) + n*(sizeof(тип массива))

Т.е. при выполнении инструкции
 a[100] = 'x';
программа просто вычислит адрес a + размер элемента * 100 и получит адрес в памяти, куда попробует записать Ваше значение. А вот удастся ей это или нет, зависит от конкретной ситуации.
Т.е. в принципе, все может пройти и гладко, если данный адрес, скажем находится в допустимых пределах - допустимых конкретной средой/операционной системой - и не принадлежит никому другому, но и в этом случае его просто кто-нибудь может его потом случайно перезаписать, но еще больше шанс, что указатель окажется вне допустимых пределов и программа рухнет.