Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 12.05.2016
Сообщений: 46
1

Объявление переменных

23.09.2018, 18:03. Показов 512. Ответов 14
Метки нет (Все метки)

В объявлении между именем типа и именем указателя ставится символ *. Он сообщает компилятору, что объявляемая переменная является указателем на переменную заданного типа. Например, объявление указателя на переменную типа char записывается следующим образом:

C++
1
char *ch;
подскажите пожалуйста, чем вот то, что выше отличается от вот этого:

C++
1
char ch;
и в каких ситуациях эту разницу можно почувствовать?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2018, 18:03
Ответы с готовыми решениями:

объявление переменных
вообщем есть задание которое не раз тут обсуждалось решалось и тд. суть не в этом. столкнулся с...

Объявление переменных
Помогите с объявлением переменных, даны такие объявления: int m1; int *m2; int **m3; int m4;...

Объявление переменных.
У меня есть два юнита с формами. В одном располагается TMainMenu, где я выбираю как производится...

Объявление переменных в С++
Начал изучение С++ и возник такой вопрос как повторно производить действия с переменными после их...

14
Модератор
Эксперт С++
10652 / 8834 / 5341
Регистрация: 18.12.2011
Сообщений: 23,640
23.09.2018, 18:18 2
C++
1
char ch;
В переменной ch хранится значение типа char (один символ).
C++
1
char* ch;
В переменной ch хранится адрес того места, где находится переменная типа char.
C++
1
2
3
4
5
6
char ch1='a',ch2='x';
char *pch;
pch=&ch1;
cout<<*pch;// вывод a
pch=&ch2;
cout<<*pch;// вывод x
0
1 / 1 / 0
Регистрация: 12.05.2016
Сообщений: 46
23.09.2018, 18:23  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
В переменной ch хранится адрес того места, где находится переменная типа char.
прошу прощения, т.е. эта звездочка* относится не к ch (*ch), а к char (char*)?
0
Don't worry, be happy
17004 / 9885 / 1902
Регистрация: 27.09.2012
Сообщений: 24,520
Записей в блоге: 1
23.09.2018, 18:23 4
Объявление переменных
1
Модератор
Эксперт С++
10652 / 8834 / 5341
Регистрация: 18.12.2011
Сообщений: 23,640
23.09.2018, 18:37 5
Цитата Сообщение от granit201z Посмотреть сообщение
т.е. эта звездочка* относится
Компилятору начхать, где она находится.
Я обычно пишу так
C++
1
2
char* c;// если объявляется один указатель
char *c1,*с2,*с3;// если указателей несколько
0
1 / 1 / 0
Регистрация: 12.05.2016
Сообщений: 46
23.09.2018, 18:48  [ТС] 6
Цитата Сообщение от zss Посмотреть сообщение
В переменной ch хранится адрес того места, где находится переменная типа char.
C++
1
2
3
4
5
6
char ch1='a',ch2='x';
char *pch;
pch=&ch1;
cout<<*pch;// вывод a
pch=&ch2;
cout<<*pch;// вывод x
попробовал в 4 строчке убрать * - вместо 'a' консоль выдала что-то непонятное. наверное, адрес.

Надо переварить как с этим работать. Пока что трудно понимаю смысл всех этих рокировок. Ведь это же не просто так придумали?
0
Модератор
Эксперт С++
10652 / 8834 / 5341
Регистрация: 18.12.2011
Сообщений: 23,640
23.09.2018, 19:04 7
Цитата Сообщение от granit201z Посмотреть сообщение
выдала что-то непонятное
Тут есть нюанс.
Для остальных переменных (не char*) действительно выдается адрес.
А для char* считается, что по этому адресу находится массив символов, заканчивающийся нулем.
Вот этот массив и выводится.
Чтобы вывести адрес надо писать так
C++
1
cout<<(void*)pch;// вывод адресa переменной ch1
0
14247 / 7685 / 1826
Регистрация: 30.01.2014
Сообщений: 12,907
23.09.2018, 19:19 8
Цитата Сообщение от granit201z Посмотреть сообщение
рошу прощения, т.е. эта звездочка* относится не к ch (*ch), а к char (char*)?
Да, звездочка - это часть типа. Образует составной тип "указатель".
0
1 / 1 / 0
Регистрация: 12.05.2016
Сообщений: 46
23.09.2018, 19:21  [ТС] 9
прошу прощения, что жестко туплю. Написал нечто следующее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int f1(char &ch17)
{
    std::cout<< &ch17 <<std::endl;
    return 0;
}
 
int main()
{
char ch1='a',ch2='x';
char *pch;
pch=&ch1;
std::cout<<*pch<<std::endl;
pch=&ch2;
std::cout<<*pch<<std::endl;
 
int f1(*ch1);
 
    return 0;
}
Хочу, чтобы оно мне выдало 'a'

Но абсолютно запутался где должны быть *, а где & и никак не могу это скомпилировать.

правильно ли я понимаю "теорию": & создает ссылку, а * вытаскивает значение из этой ссылки? Т.е. одна операция обратна по отношению к другой?
0
Модератор
Эксперт С++
10652 / 8834 / 5341
Регистрация: 18.12.2011
Сообщений: 23,640
23.09.2018, 19:28 10
C++
1
2
3
4
5
6
7
8
9
10
11
12
int f1(char *ch17) // принимаем указатель (адрес переменной)
{
    std::cout<< *ch17 <<std::endl; // разыменовываем указатель (узнаем, что хранится по этому адресу)
    return 0;
}
 
int main()
{
   char ch1='a';
   std::cout<<f1(&ch1)<<std::endl; // передаем указатель
   return 0;
}
1
1 / 1 / 0
Регистрация: 12.05.2016
Сообщений: 46
23.09.2018, 20:25  [ТС] 11
Извиняюсь, вот так тоже сработало. Не понимаю почему. Вопросы в коде написал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int f1(char& ch17)
/* но здесь же было сказано, что ее аргумент должен иметь тип ссылки (char&). Почему она приняла
(в теле main) настоящий объект? и почему не хочет принимать там ссылку (компилятор ругается)? */
{
    std::cout<< ch17 <<std::endl;
    return 0;
}
 
int main()
{
    char ch1='a';
    f1(ch1);
/* вот тут мы передаем в функцию настоящий объект, а не ссылку, хотя выше определяли в качестве
аргумента ссылку, но на это f1(&ch1); компилятор ругается */
    return 0;
}
0
Модератор
Эксперт С++
10652 / 8834 / 5341
Регистрация: 18.12.2011
Сообщений: 23,640
23.09.2018, 20:35 12
Это совсем другая песня
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int f1(char& ch17) // формальный параметр ch17 - ссылка (синоним фактической переменной) 
// значок & здесь не имеет никакого отношения к операции взятия адреса (просто случайно использован одинаковый символ)
{
    std::cout<< ch17 <<std::endl;
    ch17='b'; // изменили переменную
    return 0;
}
 
int main()
{
    char ch1='a';
    f1(ch1); // ch17 Станет синонимом ch1
      std::cout<< ch11 <<std::endl; // выводится b
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
int f1(char ch17) // формальный параметр ch17 - значение (копия фактической переменной) 
{
    std::cout<< ch17 <<std::endl;
    ch17='b'; // изменили копию
    return 0;
}
 
int main()
{
    char ch1='a';
    f1(ch1); // передали копию ch1
      std::cout<< ch11 <<std::endl; // выводится a
    return 0;
}
1
1 / 1 / 0
Регистрация: 12.05.2016
Сообщений: 46
23.09.2018, 20:58  [ТС] 13
Цитата Сообщение от zss Посмотреть сообщение
// значок & здесь не имеет никакого отношения к операции взятия адреса (просто случайно использован одинаковый символ)
простите, т.е. получается, "создание ссылки на объект" и "взятие адреса объекта" это не два разных названия одного и того же действия?
0
Модератор
Эксперт С++
10652 / 8834 / 5341
Регистрация: 18.12.2011
Сообщений: 23,640
23.09.2018, 21:02 14
"создание ссылки на объект" - это получение синонима (т.е. к одной и той же переменной можно будет обращаться под обоими именами).
"взять адрес объекта" - узнать место в памяти, где именно объект находится
1
1 / 1 / 0
Регистрация: 12.05.2016
Сообщений: 46
23.09.2018, 21:07  [ТС] 15
Цитата Сообщение от zss Посмотреть сообщение
"создание ссылки на объект" - это получение синонима (т.е. к одной и той же переменной можно будет обращаться под обоими именами).
"взять адрес объекта" - узнать место в памяти, где именно объект находится
Спасибо за развернутые ответы!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2018, 21:07

Объявление переменных
Пишу на VS2012. Перерыл кучу сайтов, но нигде не нашел, как объявить переменную в asm вставке? ...

Объявление переменных
Добрый вечер.Подскажите,пожалуйста,не могу разобраться.Непонятно,почему в строках 14-15 значение...

Объявление и инициализация переменных
помогите исправить, пожалуйста.... Решение: #include &lt;iostream.h&gt; #include &lt;math.h&gt; double...

Объявление переменных в классе
#pragma once class streetdb { public: streetdb(void); ~streetdb(void); int...


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

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

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