Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Alex_From_777
Программист по неволе
22 / 22 / 4
Регистрация: 22.04.2015
Сообщений: 423
Записей в блоге: 1
#1

Что значит * при объявлении переменной? - C++

12.10.2015, 11:11. Просмотров 600. Ответов 8
Метки нет (Все метки)

Пытаюсь разобраться в коде, предоставленном сторонними разработчиками в качестве примера.
Столкнулся вот с такой строкой:
C++
1
double *lpusBuffer;;
Да именно с такой. Да, там ; стоит два раза. Если кто знает с чем это может быть связано, то за ответ последует большая благодарность (мне то кажется, что это просто опечатка, но как знать).
Но главный вопрос: зачем нужен символ * при объявлении переменной?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2015, 11:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что значит * при объявлении переменной? (C++):

Взятие адреса у константной переменной при объявлении - C++
Можно пример?

Программа вылетает при объявлении переменной класса - C++
При создании переменной класса tree программа вылетает. Не понимаю, в чём дело. Что я не так делаю? Класс tree - бинарное дерево ...

Указание типа переменной и ссылки при объявлении\инициализации - C++
Здравствуйте! Возник такой вопрос-зачем нужно указывать тип ссылки при ее инициализации? При объявлении обычной переменной, компилятору...

Ошибка компилятора при объявлении переменной в другом файле - C++
Здравствуйте, подскажи пожалуйста почему возникает ошибка ||error: ld returned 1 exit status| Моя программа: main.cpp #include...

LNK2019 при объявлении переменной типа из пространства имен в структуре - C++
Доброго времени суток! Возникла такая проблема , при использовании типа определенного в пространстве имен в структуре BLOCK_INFO_FILE...

Изменяется ли адрес или значение переменной при объявлении ее как const? - C++
При объявлении const у нас значение переменной или адрес переменной не изменяется?

8
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
12.10.2015, 11:13 #2
Цитата Сообщение от Alex_From_777 Посмотреть сообщение
Но главный вопрос: зачем нужен символ * при объявлении переменной?
Указатель на переменную типа double.
Цитата Сообщение от Alex_From_777 Посмотреть сообщение
Да именно с такой. Да, там ; стоит два раза. Если кто знает с чем это может быть связано, то за ответ последует большая благодарность (мне то кажется, что это просто опечатка, но как знать).
Может и опечатка. Роли это не играет. Пустая инструкция будет проигнорированна.
0
Alex_From_777
Программист по неволе
22 / 22 / 4
Регистрация: 22.04.2015
Сообщений: 423
Записей в блоге: 1
12.10.2015, 11:19  [ТС] #3
Цитата Сообщение от Ilot Посмотреть сообщение
Указатель на переменную типа double.
А в чем разница тогда с:
C++
1
double lpusBuffer;
0
Байт
Эксперт C
16535 / 10805 / 1638
Регистрация: 24.12.2010
Сообщений: 20,827
12.10.2015, 11:26 #4
Цитата Сообщение от Alex_From_777 Посмотреть сообщение
в чем разница тогда с
double lpusBuffer - это просто число.
double *lpusBuffer - адрес памяти, где число хранится
C++
1
2
3
4
5
6
7
8
double pi = 3.14;
double e = 2.72;
double *p;
p = π
cout << *p;  // напечатает 3.14
p = &e;
cout << *p;  // напечатает 2.72
cout << p;  // Напечатает какое-то целое число, являющиеся адресом памяти.
1
Enno
267 / 170 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
12.10.2015, 11:27 #5
Цитата Сообщение от Alex_From_777 Посмотреть сообщение
А в чем разница тогда с:
Переменная.
Переменная это уже данные. Указатель это данные для адреса, самих данных по адресу может и не быть.
C++
1
2
3
4
double *lpusBuffer; // например 0x00003404
double Buffer; // например 16.3
*lpusBuffer; // разыменование, т.е. обращение к данным по адресу 0x00003404. С ними будут обращаться как с double, хотя может быть что угодно
&Buffer; // получение адреса. Например 0x00001004.
1
alexvikt
12 / 12 / 5
Регистрация: 29.09.2015
Сообщений: 38
12.10.2015, 11:31 #6
C++
1
double Buffer
При обращении к Buffer ты оперируешь значением переменной.
C++
1
double *lpusBuffer;;
При обращении к lpusBuffer ты оперируешь адресом переменной.
C++
1
lpusBuffer=&Buffer
Теперь lpusBuffer содержит адрес переменной Buffer.
1
Alex_From_777
Программист по неволе
22 / 22 / 4
Регистрация: 22.04.2015
Сообщений: 423
Записей в блоге: 1
12.10.2015, 13:40  [ТС] #7
Цитата Сообщение от alexvikt Посмотреть сообщение
адресом переменной.
Цитата Сообщение от Байт Посмотреть сообщение
адрес памяти, где число хранится
Может тогда кто-нибудь пояснит, зачем узнавать адрес памяти, где число хранится?
Какое практическое значение это может иметь?
0
Байт
Эксперт C
16535 / 10805 / 1638
Регистрация: 24.12.2010
Сообщений: 20,827
12.10.2015, 13:50 #8
Цитата Сообщение от Alex_From_777 Посмотреть сообщение
Может тогда кто-нибудь пояснит, зачем узнавать адрес памяти, где число хранится?
Какое практическое значение это может иметь?
Совершенно незачем его узнавать. И практического значения это не имеет. Разве только для каких-то хитрых отладок. Но этот адрес можно использовать для доступа к переменным.
Простой пример. Подсчитать сумму площадей кругов, заданных своими радиусами.
C++
1
2
3
4
5
6
7
double R[5] = { 1.0, 2.0, 4.5, 2.8, 1.4 }, S=0;
double *pR;
for(int i=0; i<5; i++) {
 pR = R+i;
 S += 3.14* *pR * *pR;
}
cout << S << endl;
1
zer0mail
2368 / 1998 / 199
Регистрация: 03.07.2012
Сообщений: 7,186
Записей в блоге: 1
12.10.2015, 15:02 #9
1. При пердаче массива передается адрес первого элемента, а не сам массив
2. Пишем функцию, которая к первому аргументу прибавляет второй
// так работать не будет, поскольку в вызывающей процедуре i1 не изменится (в параметр функции передается копия i1)
C++
1
2
3
4
   void add (int i1, int i2) 
   {
       i1 += i2;
   }
А так будет, т.к. i2 прибавится к значению переменной, адрес которой в i1:
C++
1
2
3
4
   void add (int *i1, int i2) 
   {
      *i1 += i2;
   }
3. Часто в процедуру передается не сам объект, а его адрес (начала объекта).

Добавлено через 1 час 9 минут
Alex_From_777, "Звездочка" в объявлении стоит не просто так - она обозначает переменную-указатель. А понимание и умение работать с указателями входит в самый-самый базовый минимум Си/Си++ -программиста (как, скажем, понятие производной для математика). Не надо жалеть времени для того, чтобы понять "зачем они нужны, как они устроены, как ими пользоваться". Вот ссылка на главу из учебника: Указатели и массивы.
Часто в объектах поля - не сами объекты, а указатели на какие-то другие объекты, содержащиеся в нашем сложном объекте (или связанные с ним).
Пример: такая вещь, как элемент списка и хранит указатели и использует их как параметры в функциях манипуляции со списком (вставка, удаление элементов). И без них, без указателей - никак.
1
12.10.2015, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2015, 15:02
Привет! Вот еще темы с ответами:

Что значит static для переменной-члена класса? - C++
class A{ static int x; }; Что значит static для переменной-члена класса?

Что означают элементы шаблонов при объявлении мультимножества - C++
Добрый вечер уважаемые спецы. Не могли бы объяснить по понятнее, что означают данные элементы шаблонов при объявлении мультимножества: ...

Ошибка при объявлении глобальной переменной: "Переменная не является однозначной" - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;ctime&gt; int sec(0); int min(0); int chas(0); int B = 1; int...

Что значит * при создании переменных? - C++
Я в с++ новичок, объясните по простому, зачем это? Например int *ptrvalue = new int; И ещё один вопрос возник по ходу дела, что значит...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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