Форум программистов, компьютерный форум CyberForum.ru

Объявление переменной - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
10.10.2009, 20:48     Объявление переменной #1
Два вопроса:

1) Чем отличается запись:
C++
1
int a = 10;
От:
C++
1
int a(10);
2) Что обозначает данная запись:
C++
1
2
int *a = new int (3);
*a = 2;
Мы делаем указатель на переменную и присваиваем ей значение 2? За что тогда отвечает значение 3?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
 Аватар для RazorQ
574 / 341 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
10.10.2009, 20:54     Объявление переменной #2
Цитата Сообщение от G-Cat Посмотреть сообщение
2) Что обозначает данная запись:
у тебя здесь вообще ошибка будет. Ты создаешь массив из 3 элементов типа int. Для задания значения конкретной переменной нужно написать
C++
1
a[0] = 2;   // индексация указателя
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
10.10.2009, 20:57  [ТС]     Объявление переменной #3
Это не массив, если бы стояли квадратные скобки, то получился бы динамический массив. Это я знаю.
Препод сегодня сказал что так можно создавать переменные (повторюсь, переменные), я с доски списал, пришёл домой и чёт разобраться не могу, как это работает...
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.10.2009, 20:57     Объявление переменной #4
1) формой записи. компилируется в тот же код
2) а-дурацкий способ создания примитивной переменной.
б-это эквивалент того что и:

C++
1
2
3
int *a = new int ();
*a = 3;
*a = 2;
RazorQ
 Аватар для RazorQ
574 / 341 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
10.10.2009, 20:59     Объявление переменной #5
G-Cat, создаеться именно массив
C++
1
2
int *a = new int [3];
*a = 2;    // ошибка
Для переменной нужно написать
C++
1
2
int *a = new int;
*a = 2;   // теперь здесь не будет ошибки
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.10.2009, 20:59     Объявление переменной #6
Цитата Сообщение от RazorQ Посмотреть сообщение
у тебя здесь вообще ошибка будет. Ты создаешь массив из 3 элементов типа int. Для задания значения конкретной переменной нужно написать
C++
1
a[0] = 2;   // индексация указателя
Razor, наденьте очки: здесь не создаются массивы создается единственный указатель на целое, затем выделяется память под переменную целого типа, указателю присваивается адрес этой переменной, а ей самой присваивается значение 3. затем этой переменной присваивается значение 2.
RazorQ
10.10.2009, 21:01
  #7

Не по теме:

novi4ok, да пожалуй пора спать

novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
10.10.2009, 21:03     Объявление переменной #8
Цитата Сообщение от RazorQ Посмотреть сообщение

Не по теме:

novi4ok, да пожалуй пора спать

нет, спать рано, просто очки: скобки там круглые, а не квадратные. я без очков тоже не распознаю
G-Cat
16 / 16 / 1
Регистрация: 15.03.2009
Сообщений: 94
10.10.2009, 21:14  [ТС]     Объявление переменной #9
Т.е. я правильно понимаю, что всё таки правильная запись будет:
C++
1
2
int *a = new int;
*a = 2;   // теперь здесь не будет ошибки
В чём приемущества такого вида объявления и присваивания значения переменной?

2 novi4ok:
Я правильно понял, что запись:
C++
1
2
int *a = new int (3);
*a = 2;
означает, что переменной a, через указатель, присваивается значение 3, но указатель хранит адрес этой ячейки памяти. А потом все дружно принимают значение 2?
RazorQ
 Аватар для RazorQ
574 / 341 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
10.10.2009, 21:16     Объявление переменной #10
Цитата Сообщение от G-Cat Посмотреть сообщение
В чём приемущества такого вида объявления и присваивания значения переменной?
когда переменная больше не будет нужна, её можно будет удалить
C++
1
delete a;
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
10.10.2009, 21:47     Объявление переменной #11
Ффух! Все запутали!
G-Cat, здесь происходит вот что:
C++
1
2
3
4
5
6
7
8
int *a = new int (3); 
// объявлена и создана переменная a типа "указатель на целое". 
// создана _динамическая_ переменная типа int и сразу же инициализирована значением 3. 
// адрес этой переменной присвоен переменной a - а сразу же инициализируется этим адресом. 
 
*a = 2; 
// переменной, на которую указывает a (т.е. нашей динамической переменной целого типа) 
// присвоено значение 2.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.10.2009, 21:50     Объявление переменной #12
Цитата Сообщение от RazorQ Посмотреть сообщение
огда переменная больше не будет нужна, её можно будет удалить
Это не удаление переменной. Это помечание выделенной нами области памяти как свободной , чтобы ОС могла записывать туда данные при надобности. Сама переменная указатель будет существовать как и другая локальная переменная (в своем блоке видимости).
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.10.2009, 14:50     Объявление переменной #13
Цитата Сообщение от G-Cat Посмотреть сообщение
Т.е. я правильно понимаю, что всё таки правильная запись будет:
C++
1
2
int *a = new int;
*a = 2;   // теперь здесь не будет ошибки
В чём приемущества такого вида объявления и присваивания значения переменной?
ни в чем: одни недостатки.
0. переменная-указатель все равно "автоматическая", и занимает столько же памяти, сколько и целая переменная. т.е. мы не экономим память.
1. происходит обращение к процедурам выделения памяти под переменную, на что затрачивается время.
2. память под переменную нужно освободить воизбежание утечки памяти, на что тоже уйдет время.
3. на код, выделяющий и освобождающий память, уйдет памяти на порядок больше, чем "сэкономится" на этой целой переменной.

в общем, такой код нужно выбрасывать сразу и переписывать нормально, чтоб и людЯм, и себе понятно было:

C++
1
int a = 2; // или 3, от цели зависит
и всегда писать так, если позволяют обстоятельства. а фокусы с указателем - только там, где это оправдано.

Цитата Сообщение от G-Cat Посмотреть сообщение
2 novi4ok:
Я правильно понял, что запись:
C++
1
2
int *a = new int (3);
*a = 2;
означает, что переменной a, через указатель, присваивается значение 3, но указатель хранит адрес этой ячейки памяти. А потом все дружно принимают значение 2?
нет, переменной а не присваивается значение 3, т.к. она имеет тип "указатель на целое". ей присваивается значение адреса памяти, выделенного для новой целой переменной. этой переменной сразу после выделения памяти присваивается значение 3. затем ей (новой целой переменной, а не указателю на нее!) присваивается значение 2 (значение переменной "a" при этом не меняется).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2014, 11:42     Объявление переменной
Еще ссылки по теме:

Объявление переменной в цикле C++
C++ Объявление целочисленной переменной с именем var_i
Объявление переменной внутри цикла while C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Oxie
Заблокирован
11.05.2014, 11:42     Объявление переменной #14
int a(2) - это инициализация переменной в ANSI C
Yandex
Объявления
11.05.2014, 11:42     Объявление переменной
Ответ Создать тему
Опции темы

Текущее время: 11:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru