Модераторы: bsa

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Интересные особенности С++, Из книги С++ Primer 4 издание 
V
    Опции темы
zim22
Дата 21.1.2009, 17:30 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Читаю эту книгу сейчас. И открываю для себя интересные вещи. Буду в этой теме делиться ими с вами.

1) Можно ли создать массив нулевого размера?
так тельзя: char c[0];
так можно: char *cp = new char[0];

2) Чем отличаются указатели от ссылок?
помимо всего прочего поведением при присваивании:
в случае указателей значение переменных не меняется

Код

int i1 = 100, i2 = 1000;
int *pi1 = &i1, *pi2 = &i2;
pi1 = pi2;

int &ri1 = i1, &ri2 = i2;
ri1 = ri2;


Можно ли указывать в качестве индекса массива отрицательное значение?
Ответ: можно
Код

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = &arr[3];
int *ptr2 = ptr;
ptr2[-2] = 3;




--------------------
PM MAIL   Вверх
GoldFinch
Дата 21.1.2009, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



осталось только написать почему именно так происходит
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 21.1.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Это легко объяснить - по умолчанию new вызывает malloc(). Из документации к malloc():

Цитата

Upon successful completion with size not equal to 0, malloc() shall return a pointer to the allocated space. If size is 0, either a null pointer or a unique pointer that can be successfully passed to free() shall be returned. Otherwise, it shall return a null pointer [CX]   and set errno to indicate the error.


PM MAIL   Вверх
Goliaf777
Дата 21.1.2009, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.11.2008

Репутация: нет
Всего: нет



Хотел создать темму по одному вопросу но вот попалась похожая по тематике тема.Сказано:"Массивы тесно связаны с указателями но понять эту связь очень сложно".Может кто-нибудь обьяснить это или даст ссылку на статью.
Заранее спасибо  smile 
PM MAIL ICQ Skype Jabber   Вверх
mes
Дата 21.1.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Goliaf777 @  21.1.2009,  21:08 Найти цитируемый пост)
.Сказано:

Интересно, где это так сказано ?! 



--------------------
PM MAIL WWW   Вверх
zim22
Дата 21.1.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Goliaf777, в книге Брайана Керниган, Денниса Ритчи "Язык программирования C" 
отлично объясняется как указатели связаны с массивами
http://www.ozon.ru/context/detail/id/2480925/


--------------------
PM MAIL   Вверх
mrbrooks
Дата 22.1.2009, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Цитата(Goliaf777 @  21.1.2009,  22:08 Найти цитируемый пост)
Хотел создать темму по одному вопросу но вот попалась похожая по тематике тема.Сказано:"Массивы тесно связаны с указателями но понять эту связь очень сложно".Может кто-нибудь обьяснить это или даст ссылку на статью.

а ты попробуй поискать по форуму. эта тема поднимается наверно раз в месяц. хотя само понимание прийдет при повседневном использовании C++.
PM MAIL   Вверх
Lazin
Дата 22.1.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



для чего все это?
PM MAIL Skype GTalk   Вверх
zim22
Дата 22.1.2009, 10:45 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Два указателя, переданные вектору, задают диапазон его значений
Код

const size_t arr_size = 6;
int int_arr[arr_size] = {110, 12, 32, 13, 24, 35};
std::vector<int> ivec(int_arr, int_arr + arr_size);

Т.е. можно не писать много строк вида
Код

ivec.push_back(110);
ivec.push_back(12);
...
ivec.push_back(35);

А инициализировать вектор в одной строке!


--------------------
PM MAIL   Вверх
mes
Дата 22.1.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  22.1.2009,  09:45 Найти цитируемый пост)
Два указателя, переданные вектору, задают диапазон его значений

так зачем создавать дополнительно объект на стеке если размер массива известен наперед :
Цитата(zim22 @  22.1.2009,  09:45 Найти цитируемый пост)
const size_t arr_size = 6;
int int_arr[arr_size]= {110, 12, 32, 13, 24, 35};

в таком случае достаточно использовать простой указатель.



Это сообщение отредактировал(а) mes - 22.1.2009, 10:51


--------------------
PM MAIL WWW   Вверх
zim22
Дата 22.1.2009, 11:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



mes, объект arr_size я создал для того, чтобы избежать "магических чисел" в коде программы
ведь в конструкторе вектора нужно указывать 2 указателя, на начало и на конец последовательности.
без него код выглядел бы так:
Код

int int_arr[] = {110, 12, 32, 13, 24, 35};
std::vector<int> ivec(int_arr, int_arr + 6);




--------------------
PM MAIL   Вверх
mes
Дата 22.1.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  22.1.2009,  10:43 Найти цитируемый пост)
чтобы избежать "магических чисел"

smile

Код

const size_t arr_size = 6; //  о ! магическое число :) правда не сильно страшное, так как ниже идет применение ..
int int_arr[arr_size] = {110, 12, 32, 13, 24, 35}; // ну а тут лишнее создание массива, значение размера которого, известно на этапе компиляции
                                        // в следствии чего, предопределенное число теряет смысл.


Код

const size_t arr_size = 6;  // также с числом, но в данном случае оно оправдано
int * int_arr = {110, 12, 32, 13, 24, 35}; // так как мы не создаем статического массива ,а используем указатель на массив в области данных.
                                      // и размер такого массива мы вынуждены считать вручную..


ну а если с массивом, то магические цифры абсолютно не оправданы: 
Код

int int_arr[] = {110, 12, 32, 13, 24, 35};
const size_t arr_size = sizeof(int_arr)/sizeof(int); 

 smile 




Это сообщение отредактировал(а) mes - 22.1.2009, 17:29


--------------------
PM MAIL WWW   Вверх
zim22
Дата 22.1.2009, 16:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Код

int int_arr* = {110, 12, 32, 13, 24, 35};

код не компилируется. даже если * поставить перед названием переменной smile
Код

const size_t arr_size = sizeof(int_arr)/sizeof(int); 

разве этот код будет выполняться не дольше, чем const size_t arr_size = 6;...




--------------------
PM MAIL   Вверх
Lazin
Дата 22.1.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(zim22 @  22.1.2009,  16:23 Найти цитируемый пост)
разве этот код будет выполняться не дольше, чем const size_t arr_size = 6;...

нет, этот код вообще не будет выполняться  smile 
PM MAIL Skype GTalk   Вверх
Goliaf777
Дата 22.1.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 19.11.2008

Репутация: нет
Всего: нет



mes  в великой книжке которую написал Прата и он прав по моему.

zim22 Спасибо, посмотрим smile
PM MAIL ICQ Skype Jabber   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.