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

С++ для начинающих

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

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

10.10.2009, 20:48. Просмотров 1314. Ответов 13
Метки нет (Все метки)

Два вопроса:

1) Чем отличается запись:
C++
1
int a = 10;
От:
C++
1
int a(10);
2) Что обозначает данная запись:
C++
1
2
int *a = new int (3);
*a = 2;
Мы делаем указатель на переменную и присваиваем ей значение 2? За что тогда отвечает значение 3?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2009, 20:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объявление переменной (C++):

Объявление переменной - C++
Здравствуйте! В программе есть две формы. Как объявить переменную чтобы она была доступна в обеих формах? Или как переменную из одной...

Объявление переменной - C++
Доброго времени суток. Возник вопрос, по какой причине при следующей форме записи, переменные "y" и "z" считаются компилятором (VS12) не...

Объявление переменной в цикле - C++
for (int i=0; i!=5; ++i) { int tmp; std::cout << &tmp << std::endl; } Будет ли переменная tmp объявляться при каждой...

Условное объявление переменной - C++
Добрый день. Возникла необходимость объявления одного из полей в зависимости от параметров шаблона класса. Нет ли в C++ возможности...

Объявление переменной внутри цикла while - C++
Доброго времени суток, форумчане. Расскажите нубу, что происходит при объявлении объявленной переменной. Знаю, звучит глупо, посему...

Объявление переменной вне case - C++
Не могу понять что-то не так case R: { .... if ()

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
RazorQ
577 / 344 / 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
551 / 504 / 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
577 / 344 / 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
551 / 504 / 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
551 / 504 / 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
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
10.10.2009, 21:16 #10
Цитата Сообщение от G-Cat Посмотреть сообщение
В чём приемущества такого вида объявления и присваивания значения переменной?
когда переменная больше не будет нужна, её можно будет удалить
C++
1
delete a;
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
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
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.10.2009, 21:50 #12
Цитата Сообщение от RazorQ Посмотреть сообщение
огда переменная больше не будет нужна, её можно будет удалить
Это не удаление переменной. Это помечание выделенной нами области памяти как свободной , чтобы ОС могла записывать туда данные при надобности. Сама переменная указатель будет существовать как и другая локальная переменная (в своем блоке видимости).
novi4ok
551 / 504 / 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" при этом не меняется).
Oxie
Заблокирован
11.05.2014, 11:42 #14
int a(2) - это инициализация переменной в ANSI C
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2014, 11:42
Привет! Вот еще темы с ответами:

Объявление переменной своего типа - C++
Есть код #include <iostream> #include <iomanip> //#include "complexz" using namespace std; int main(){ double a,b,c,d; ...

Объявление переменной в цикле - зло? - C++
Во имя читаемости пришлось объявить и инициализировать ссылки на переменные и сами переменные в теле цикла. Преподаватель против такой...

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

Объявление третьей переменной в функции strtok_s - C++
Вот кусок кода: char **context; char *pch = strtok_s(str_text, " ,.", &context); //во втором параметре указаны разделители...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.05.2014, 11:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru