
** cpp1 ** 15.05.2004
Лекция 12 Адреса, ссылки, указатели в С++.
Передача данных для графика
12.1 Передача данных для построения графика в MathCad
Можно упростить процесс вывода графика, если использовать MathCAD.
Для этого в программе на С++ нужно сформировать массивы x, y со
значениями абсцисс и ординат N точек, записать их в файл, а затем этот
файл считать оператором READ программы MathCAD.
Приводим пример такой программы для построения графика из раздела 11.2.
// gr2.cpp // (12.1)
#include <conio.h> // for getch
#include <fstream.h>
#include <math.h>
void main (void) {
int N, k; cout << "Введите N= ";
cin >>N; cout<< endl<<" Дано N= "<<N<<endl;
ofstream mr ( "gr2.txt");
mr<<N<<endl;
float x[50], y[50];
for (k = 0; k < N; k++){
x[k] = 0.5*k; mr << x[k] << " "; }
mr<<endl;
for (k=0; k<N; k++) { y[k]=sin(k); mr<<y[k] << " "; }
cout<<endl<< " OK !! "; getch();
}
Программа для MathCAD
Рис. 12.1
Кривая имеет вид ломаной из-за малого количества точек N = 6, выбранных для уменьшения длины массивов x, y при их простейшем выводе.
12.2 Адрес объекта
Объём оперативной памяти (ОП) современного компьютера составляет
примерно 1 гигабайт. Каждый байт имеет номер, например, от 0 до 999 999 999.
В шестнадцатеричной системе, применяемой для номеров, это соответствует
значениям от 0 до 3b9ac9ff. Каждой переменной или константе программы
выделяется один или несколько байтов. Например,
типу char соответствует 1 байт, типу int - 4 байта.
Адрес - это номер байта в оперативной памяти, для группы байтов - это номер первого байта. В разделе 8.4 уже использовали операцию получения адреса & .
С помощью этой операции можно вывести адрес любого объекта.
Пример: . . . . int k; int mas[9]; char zz[4]="# # #";
. . . . . . .
cout << k<<" "<< mas[0] <<" "<< zz<< endl; (12.2)
cout << &k <<" "<< &mas[0] <<" "<< &zz<< endl;
cout << (long)&k <<" "<< (long)&mas[0] <<" "<< (long)&zz<< endl;
Обозначение &k читается как "адрес ка". В первом операторе cout выводятся значения, во втором - адреса, в третьем - десятичные адреса.
Вывод в (12.2) может иметь, например, следующий вид:
7 5 ###
0X0064fe00 0x0064fc38 0x0064fdfc
6618624 6618168 6618620
Здесь два символа 0xперед адресом означают, что используется
шестнадцатеричное число. При выводе адреса можно использовать также
функцию форматного вывода printfс дескриптором %pили %x.
С операцией &связана другая операция -операция обращения по адресу.
Она обозначается как звёздочка *и может стоять только перед адресом.
Её называют разадресацией или разыменованием.
Результатом операции * является содержимое ячейки с указанным адресом.
Например, * yq- это значение, находящееся по адресуyq.
Пусть b=5. - это вещественная переменная с адресомyq, т.е.yq=&b.
Для нее имеем * yq=b= 5.
Если к адресу переменной применить операцию * , например, * &b,
то получим значение переменной. Следовательно,
*&bb (12.3)
Это означает, что операции * и & взаимно уничтожаются по аналогии с
операциями * и /, например, 2 * b/ 2 =b.
Переходим к использованию адресов при вызове функций. При вызове функций им передаются значения аргументов. Так как каждый аргумент имеет адрес, то очевидно, что существует другая возможность передачи аргументов: передавать не сами значения, а их адреса, что более эффективно, т.к. не нужно выполнять копирование. Рассмотрим такую передачу подробнее.