Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / lect12.doc
Скачиваний:
8
Добавлен:
20.05.2014
Размер:
69.12 Кб
Скачать

** 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,

то получим значение переменной. Следовательно,

*&bb (12.3)

Это означает, что операции * и & взаимно уничтожаются по аналогии с

операциями * и /, например, 2 * b/ 2 =b.

Переходим к использованию адресов при вызове функций. При вызове функций им передаются значения аргументов. Так как каждый аргумент имеет адрес, то очевидно, что существует другая возможность передачи аргументов: передавать не сами значения, а их адреса, что более эффективно, т.к. не нужно выполнять копирование. Рассмотрим такую передачу подробнее.

Соседние файлы в папке Лекции