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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели, строки, классы и пр. Си++ новичкам посвящается... 
V
    Опции темы
ПанкПрогаммист
Дата 25.9.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нефига не понял)) сушствует книга с++ для чаиников??  smile 
PM MAIL   Вверх
bsa
Дата 25.9.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



ПанкПрогаммист, попробуй тут посмотреть: Часто задаваемые вопросы
PM   Вверх
Axsandr
Дата 28.3.2010, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ПанкПрогаммист @ 25.9.2009,  13:42)
Нефига не понял)) сушствует книга с++ для чаиников??  smile

язык программирования С++ Бьерн Страуструп 
В принципе очень доступно все написано....


_____________________
Для тех, кто интересуется forex есть выгодные условия торговли.


Это сообщение отредактировал(а) Axsandr - 29.3.2010, 13:28
PM MAIL   Вверх
EgoBrain
Дата 26.6.2012, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(maxim1000 @ 22.9.2005,  00:56)
ссылка ближе к указателю, чем к пременной
в общем-то именно так она и реализована на уровне компилятора
просто везде, где она используется, компилятор дорисовывает звездочку smile
...

А что происходит при использовании ссылки на сложные типы данных, например структуры?
Компилятор меняют ссылку на указатель, и вместо оператора "." вставляет оператор "->"?
PM MAIL ICQ Skype   Вверх
baldina
Дата 26.6.2012, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ничего он не меняет. maxim1000 имел в виду семантику, связанную с реализацией, но не саму реализацию.
впрочем, если считать, что в ассемблерном виде может (и скорее всего будет) использоваться косвенная адресация, то можно и так сказать
PM MAIL   Вверх
kolesnle
Дата 3.6.2013, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Упертый сишник
*


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

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



Цитата(EgoBrain @  26.6.2012,  12:07 Найти цитируемый пост)
Компилятор меняют ссылку на указатель, и вместо оператора "." вставляет оператор "->"? 

Код

(*pos).y ...

PM MAIL   Вверх
rvpxbnkx
Дата 18.7.2013, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Поясните пожалуйста. Программа на си. Я так понимаю массив это указатель на первый элемент + число элементов. В примере char  *dic[][40] получается трехмерный массив. Потом он приобразуется с p = (char **)dic;
Вот я и не понимаю почему трехмерный массив станет 2-х мерным. И еще Не совсем понятно чем такая конструкция char (*p)[10]; отличается от char *s[]

Код
/* Простой словарь. */
#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* список слов и их значений */
char  *dic[][40] = {
  "атлас", "Том географических и/или топографических карт.",
  "автомобиль", "Моторизоравонное средство передвижения.",
  "телефон", "Средство связи.",
  "самолет", "Летающая машина.",
  "", ""  /* нули, завершающие список */
};

int main(void)
{
  char word[80], ch;
  char **p;

  do {
    puts("\nВведите слово: ");
    scanf("%s", word);

    p = (char **)dic;

    /* поиск слова в словаре и вывод его значения */
    do {
      if(!strcmp(*p, word)) {
        puts("Значение:");
        puts(*(p+1));
        break;
      }
      if(!strcmp(*p, word)) break;
      p = p + 2;  /* продвижение по списку */
    } while(*p);
    if(!*p) puts("Слово в словаре отсутствует.");
    printf("Будете еще вводить? (y/n): ");
    scanf(" %c%*c", &ch);
  } while(toupper(ch) != 'N');

  return 0;
}

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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



char *dic[][40] массив массивов по 40 указателей на char. char ** - это указатель на указатель на char. Т.е. когда идет это преобразование ты отказываешься от одного измерения.
Обычно, подобные вещи делают так: const char *dic[] = { ... };

А вообще, почитай про указатели и ссылки еще тут.
PM   Вверх
eses
Дата 30.7.2013, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

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


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 19.7.2012
Где: Архангельск

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



Привет всем.
Есть незамысловатый код:
Код

int main()
{
   ... //здесь создал разносортные указатели и выделил им память
   ...
   if(...)//проблема, надо закрыть приложение
   {
      ... //надо освободить память
      return 1;
   }
   ...
   if(...)//проблема, надо закрыть приложение
   {
      ... //надо освободить память
      return 1;
   }
   ...
   if(...)//проблема, надо закрыть приложение
   {
      ... //надо освободить память
      return 1;
   }
   ...
   ... //освобождаю память для всех указателей
   return 0;
}


Как бы так покомпактнее сделать, чтобы в этих if'ах не копипастить освобождение памяти для всех указателей? Я пытался с запретным goto прыгать в конец программы сразу к освобождению, да не заладилось чегой-то...
И если в этих условиях вообще о таком не заикаться, то будет ли утечка памяти?
PM MAIL   Вверх
baldina
Дата 22.11.2013, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



в main() уже ничего не надо освобождать, ОС освободит.
ну а вообще - сделайте локальный объект, освобождайте в деструкторе. при возврате из функции деструктор вызовется автоматически.
PM MAIL   Вверх
gendalf7771
Дата 22.11.2013, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 19.7.2012
Где: Архангельск

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



baldina, то есть если, скажем, у меня в программе большущие динамические массивы char наклёпаны, то в рамках main() можно в принципе забить на delete?

И вопрос вдогонку. Код:

Код

char* anyFunc(...)
{
   ...
   char *szTemp = new *char[iSize];
   strcpy(szTemp, szTemp2);
   return szTemp;
}


Вот бывает иногда параметров у функции итак навалом, ну не хочу я szTemp передавать среди прочих, а на выходе функции массив получить надо. Есть ли адекватный способ получить желаемый массив с нормальный освобождением памяти?
PM MAIL   Вверх
bsa
Дата 22.11.2013, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



gendalf7771, если ты можешь использовать возможности C++11, то рекомендую использовать std::unique_ptr:
Код
std::unique_ptr<MyClass> ptr1(new MyClass);
std::unique_ptr<int> ptr2(new int[100]);
Если ты ограничен только C++03 или описанный выше подход не нравится, то тогда можно использовать std::vector и std::auto_ptr (только очень внимательно прочитай документацию на этот класс).
PM   Вверх
baldina
Дата 22.11.2013, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



delete в main() дань хорошему стилю, если не сделать, отладчик будет показывать утечки памяти.
но т.к. приложение завершается, и ОС освободит память, занятую приложением, с этой точки зрения этот delete ничего не дает.

Цитата(gendalf7771 @  22.11.2013,  02:03 Найти цитируемый пост)
адекватный способ получить желаемый массив с нормальный освобождением памяти

возвращать объект. например, unique_ptr
PM MAIL   Вверх
gendalf7771
  Дата 22.11.2013, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 19.7.2012
Где: Архангельск

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



Большое спасибо за ответы!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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