Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Снятие адреса (разадресация).

Читайте также:
  1. IV.Снятие ограничений в половой жизни
  2. АБСОЛЮТНАЯ И ОТНОСИТЕЛЬНАЯ АДРЕСАЦИЯ ПРИ РАБОТЕ С ФОРМУЛАМИ
  3. АДРЕСА И РЕКВИЗИТЫ СТОРОН
  4. АДРЕСА И РЕКВИЗИТЫ.
  5. Адреса районных судов в Воронеже
  6. Адреса, реквизиты и подписи Сторон.
  7. Адресация данных

Массивы

Пример.

int n;

float *a;

printf(“n=”); scanf(“%d”,&n);

a=(float * ) malloc(n*sizeof(float)); // другой вариант

// a=(float * ) сalloc(n, sizeof(float));

Спросили у пользователя n и разместили в динамической памяти массив из n элементов типа float.

После окончания работы с массивом память необходимо освободить free(a);

Возможен вариант в стиле C++:

int n;

float *a;

cout<<“n=”; cin>>n;

a=new int[n]; // Выделяем память.

… // Поработали с массивом

delete [] a; // Освобождаем память

 

С элементами массива можно работать как с обычными переменными, т. е. присваивать им значения (a[3] = 5.0;), спрашивать их значения у пользователя (scanf(“%f”, &a[2]); или cin >> a[2];), печатать (printf(“%6.2f”,a[2]); или cout << a[2]);) и т.п.

 

Массивы и указатели.

 

Адрес переменной – это номер ячейки памяти, в которой она расположена.

Указатель – это переменная, предназначенная для хранения адреса некоторого объекта (например, другой переменной).

 

Объявление указателя:

int *p; // Объявили указатель p на переменную целого типа.

// Теперь в p можно хранить адрес переменной типа int.

 

Для работы с указателями есть 2 операции:

Amp; - взятие адреса

снятие адреса (разадресация).

Если x – переменная, то &x – ее адрес.

Если p – указатель на переменную, то *p - значение этой переменной.

Имя массива – это адрес его нулевого элемента.

Пусть объявлен массив:

int a[5]={7,3,5,4,2};

 

Тогда a – это то же самое, что и &a[0].

*a – это то же самое, что и a[0]. В нашем случае *a = 7.

К указателю можно прибавить число.

Если a – это адрес элемента a[0], то a+3 – это адрес элемента a[3].

Операция сложения с константой учитывает размер адресуемых элементов.

Другими словами, если a – указатель на переменную типа int (т.е. номер ячейки, в которой содержится переменная типа int), то прибавление тройки увеличивает этот номер на 3*sizeof(int).

Таким образом,

a+3 – это то же самое, что и &a[3].

*(a+3) – это то же самое, что и a[3].

На самом деле, увидев обращение a[3], машина перепишет его в виде индексного выражения *(a+3).

 

Пример.

int a[5]={3,2,7,6,5};

printf(“%d”, 3[a]);

Что будет напечатано?

 

Выражение 3[a] будет переписано в виде *(3+a), это равно *(a+3), то есть a[3]. Будет напечатано число 6.

Указатели можно вычитать.

Пример.

int a[5]={3,2,7,6,5};

int *p1, *p2;

int m;

p1=&a[1];

p2=&a[4];

m=p2-p1;

В результате m=3.

 

Двумерные массивы

Пусть задан двумерный массив из m строк и n столбцов. Есть различные способы получения доступа к его элементам. Чтобы получить доступ к элементу из i-й строки и j-го столбца матрицы a, достаточно написать a[i][j].

Как и в одномерном случае, имя массива является адресом его нулевого элемента a[0][0]. Учитывая, что элементы массива располагаются в памяти подряд, для доступа к a[i][j] можно использовать индексное выражение *(a+n*i+j).

Можно обратиться к элементу массива и другими способами: *(*(a+i)+j) или *(a[i]+j).

 

Можно несколькими способами выделять динамическую память под двумерный массив.

 

При выделении памяти сразу под весь массив количество строк можно задавать с помощью переменной или выражения:

int m,n;

cout << “m=”;

cin >> m;

cout << “n=”;

cin >> n;

int **a = new int *[m];

for(int i=0; i<m; i++)

a[i] = new int [n];

 

 


Дата добавления: 2015-07-11; просмотров: 83 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Программа на ЯВУ ТР7.0| Функции от матриц.

mybiblioteka.su - 2015-2024 год. (0.007 сек.)