Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6308
Последний выпуск: 19.06.2015

Применение указателей в C++

Автор: Уваров Андрей

Напишем следующую программу, которая использует указатели. Предположим, что значение iNum1 равно 2, а адрес iNum1 - 1000. INum1 будет занимать байты с адресами 1000, 1001, 1002 и 1003. Если значение iNum2 было равно, то переменная iNum2 могла бы занимать ячейки с адресами 1004, 1005, 1006 и 1007. Следовательно, iNumI начинается с адреса 1000, а iNum2 начинается с адреса 1004. Однако, хотя iNumI занимает четыре адреса, в С/С++ адресом iNumI называется адрес 1000, а адресом iNum2 называется адрес 1004. Теперь объявим две переменные как указатели - pNum1 и pNum2. Ваша цель состоит в том, чтобы сохранить число 1000 (адрес iNumI) в pNum1 и число 1004 (адрес iNum2) в pNum2.

Внесите следующие изменения в main(void):

void main(void) {
	int iNum1;
	int iNum2;
	int iResult;
	int* pNum1;
	int* pNum2;
	iNum1 = 2;
	iNum2 = 3;
	pNum1 = &iNum1;
	pNum2 = &iNum2;
	iResult = *pNum1 + *pNum2;
	cout << "The result is: ";
	cout << iResult << endl;
	}

Код, который вы ввели, объявляет три целых переменных:

int iNum1;
int iNum2 ;
int iResult;

Затем объявляются еще две переменные:

int* pNum1;
int* pNum2;

Обратите внимание, что в объявлении использована запись int*. К какому же типу относится переменная pNum1? Можете ли вы сохранить целое значение в pNum1? Нет. В pNum1 вы можете сохранить адрес переменной типа int. Вы должны сохранить в переменной pNum1 число 1000, поскольку 1000 является адресом iNum1. Точно так же вы должны сохранять адрес целого значения и в переменной pNum2. После этого вы присваиваете значения переменным iNum1 и iNum2:

iNum1 = 2;
iNum2 = 2;

Затем вы присваиваете значения переменным pNumI и pNum2:

pNum1 = &iNum1;
pNum2 = &iNum2;

Эти два оператора сохраняют адрес переменной iNum1 в pNum1 и адрес iNum2 в pNum2. Далее вам нужно вычислить результат сложения iNum1 с iNum2. Вы могли бы бы просто написать оператор

iResult = iNum1 + iNum2;

Однако попробуем выполнить вычисления, применив указатели, а не переменные. Например, чтобы вычислить результат сложения iNuml и iNum2, вы пишете следующий оператор:

iResult = *pNum1 + *pNum2;

Когда вы используете указатель с предшествующим символом *, вы извлекаете значение, хранящееся по данному адресу. *pNum1 - это то же, что и *1000, так что программа обращается к значению, хранящемуся по адресу 1000. Поскольку переменная pNum1 была объявлена как int* (а компилятор знает, что целое значение занимает четыре байта памяти), программа обращается к адресам 1000, 1001, 1002 и 1003. Она находит по этим адресам значение 2, так как *pNum1 равно 2. Аналогично, *pNum2 равно 3, поскольку pNum2 равно 1004, а ячейки памяти 1004, 1005, 1006 и 1007 содержат целое со значением. И, наконец, выполняется оператор cout, который выводит на экран значение переменной iResult:

cout << "The result is: " << endl;
cout << iResult;

Сохраните свою работу, выполните компиляцию и компоновку программы. Запустите программу и убедитесь, что значение iResult равно 5 (2+3=5).

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
100K
26 февраля
Blogan
0 / / 26.02.2019
Мне нравитсяМне не нравится
26 февраля 2019, 12:23:59
За время моего преподавания языка С++ я заметил, что как-раз указатели являются одной из самых непонятных тем для начинающих. Я даже знаю целую книгу, которую посвятили указателям в С++. А здесь даже страницы текста нет. Я не знаю, как автор собирался "научить" людей указателям, но в этой статье ему это не удастся. К коду все еще остаются претензии (посмотрите мой комментарий к предыдущей статьи этого курса), но здесь появляются новые замечания. Во-первых если вы создаете переменную, и перед ее именем ставите префикс, как здесь (например i - int, p - pointer), это именование называется "Венгерская Нотация". Она была придумана очень давно, еще до 2000 года и на данный момент ее никто не использует, потому что она не удобна и лишняя. Современные программы дают программисту максимум подсказок, чтобы он понял что это за переменная.
2.
94K
26 ноября 2014 года
Алексей Лебедев
0 / / 26.11.2014
Мне нравитсяМне не нравится
26 ноября 2014, 17:46:22
как посмотреть работу программы?
3.
65K
09 ноября 2010 года
Dtriger
0 / / 09.11.2010
+1 / -0
Мне нравитсяМне не нравится
9 ноября 2010, 20:48:25
pet++0x
думаю автор судя по дате первых каментов over9000 забыл на тему.

А вообще с какой стати пытаться засунуть символ в Wild pointer который ссылается черт знает куда
4.
65K
19 октября 2010 года
pet++0x
0 / / 19.10.2010
+1 / -1
Мне нравитсяМне не нравится
19 октября 2010, 19:22:01
указатели указателями... в вот такое не работает (комилится, но не работает):

char c1;
char* c2;
char* c3;

c1='A';
c2=(char *)'B';
*c3='C';

думаю автору темы про указатели следует пояснить эту проблему. :)
4.1.
98K
13 января 2017 года
tinger
0 / / 13.01.2017
Мне нравитсяМне не нравится
13 января 2017, 18:32:23
c1='A'; - это вроде дожно пройти без ошибок
c2=(char *)'B'; - здесь не уверен.Если компилятор такой маленький адрес примет без проблем, тогда ок. Ну вроде и это должно проходить.
*c3='C'; - здесь просто не выделена память под указатель. Поэтому по идее должно свалиться.
5.
Аноним
+4 / -0
Мне нравитсяМне не нравится
21 апреля 2006, 18:38:58
Да не ставьте вы эту тысячу!
Операционная система автоматически выделяет области памяти под переменные и вручную вы этого сделать не сможете! Мы можем только скопировать адрес определенной переменной и в дальнейшем ее использовать...
6.
Аноним
+3 / -0
Мне нравитсяМне не нравится
25 февраля 2006, 19:00:34
"Пробовал подменить *pNum1 на *1000 выскочила ошибка."

ДЕРЕВО!
это же образно сказанно, чтобы понятьнее было.
*1000 не в коем случае вводить нельзя..так как это и так понятно.
7.
Аноним
+3 / -0
Мне нравитсяМне не нравится
28 ноября 2005, 16:30:42
> Пробовал подменить *pNum1 на *1000 выскочила ошибка.

(ключевое)__Предположим___, что ...адрес iNum1 - 1000
8.
Аноним
+2 / -2
Мне нравитсяМне не нравится
13 сентября 2005, 19:56:32
>*pNum1 - это то же, что и *1000

Пробовал подменить *pNum1 на *1000 выскочила ошибка.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог