Применение указателей в 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
cout
}
Код, который вы ввели, объявляет три целых переменных:
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
cout
Сохраните свою работу, выполните компиляцию и
компоновку программы. Запустите программу и убедитесь, что значение iResult
равно 5 (2+3=5).
Список литературы
Для подготовки данной работы были использованы
материалы с сайта http://www.realcoding.net