Напишем следующую программу, которая использует указатели. Предположим, что
значение 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).
|