Лабораторна робота Вказівки, масиви і символьні рядки в мові C програма вказівка масив символ рядок
1. Мета роботи

Метою лабораторної роботи є отримання практичних навиків в роботі з вказівниками і з адресною арифметикою в мові С.

2. Теоретичні відомості

В С++ існує надзвичайно потужний інструмент для роботи зі складними агрегатами даних, який надає загальний підхід до різних на перший погляд програмних об’єктів таких як масив та рядок. Цей і нструмент базується на широкому використанні вказівника.

Вказівник - це символічне представлення адреси. Він використовується для непрямої адресації змінних і об'єктів.

В мові С++ є операція визначення адреси — &, за допомогою якої визначається адреса комірки пам’яті, що містить задану змінну. Наприклад, якщо vr — ім’я змінної, то &vr — адреса цієї змінної.

В С++ також існують і змінні типу вказівник. Значенням змінної типу вказівник є адреса змінної або об'єкта. Нехай змінна типу вказівник має ім'я ptr, тоді в якості значення їй можна присвоїти адресу за допомогою наступного оператора:

ptr=&vr;

В мові С++ при роботі з вказівниками велике значення має операція непрямої адресації — *. Операція * дозволяє звертатися до змінної не напряму, а через вказівник, який містить адресу цієї змінної. Ця операція є одномісною і має асоціативність зліва направо. Цю операцію не слід плутати з бінарною операцією множення. Нехай ptr — вказівник, тоді *ptr — це значення змінної, на яку вказує ptr.

Опис змінних типу вказівник здійснюється за допомогою операторів наступної форми:

<тип> *<ім'я вказівника на змінну заданого типу>;

Кожна змінна в програмі це об'єкт, що має ім'я і значення по імені можна звернутися до змінного й одержати її значення.

Оператор присвоювання ( = ) виконує зворотну дію: імені змінної ставиться у відповідність значення.

a=10;

Вираз &a дозволяє одержати адресу ділянки пам'яті, виділеного змінній а. Операція & застосовна тільки до об'єктів, що мають ім'я і розміщених у пам'яті.

Маючи можливість визначити адреси змінної за допомогою &, треба мати можливість працювати з цією адресою: зберігати його, передавати, перетворювати.

Для цього вводиться поняття вказівника.

Вказівник - це змінна, значенням якої служить адреса об'єкта конкретного типу. Нульова адреса позначається константою NULL, що визначена в заголовному файлі stdio.h. Щоб визначити вказівник треба повідомити на об'єкт якого типу посилається цей вказівник.

char *z;

int *k,*i;

float *f;

* - це операція разіменування. Операндом цієї операції завжди є вказівник. Результат операції - це той об'єкт, що адресує вказівник_операнд.


*z=’$ ‘;


*k=*i=0;

Приклад:

int e, c, b, *m;

. . . . . . . . .

m = &e ;

*m = c + b ;

Операції над вказівниками.

присвоювання (=);

одержання значення об'єкта, на який посилається вказівник (*);

одержання адреси самого вказівника (&).

Приклад:

int date = 10;

int *i, *k;;

i = &date;

k = i;

z = NULL;

Подібно будь-яким змінної змінна типу вказівник має ім'я, арес у пам'яті і значення.


За допомогою унарних операцій ++ і –і числові значення змінних типу вказівник міняються по різному, у залежності від типу даних, з яким зв'язані ці змінні.

Приклад:

char *z;

int *k,*i;

float *f;

. . . . . . .

z++; // значення змінюється на 1

і++; // значення змінюється на 2

f++; // значення змінюється на 4

Тобто при зміні вказівника на 1, вказівник переходить до початку наступного (попереднього) поля тієї довжини, що визначається типом об'єкта, який адресується вказівником.

2.1 Використання вказівників при роботі з масивами

Ім'я масиву без індексу є вказівником-константою, тобто адресою першого елемента масиву (a[0]).

a

*a = = a[0] ;

*(a+1) = = a[1];

 . . . . . . . . .

*(a+і) = =a[і];

Відповідно до синтаксису в С існують тільки одномірні масиви, але їх елементами , у свою чергу, теж можуть бути масиви.

int a[5][5];

Для двовимірного масиву:

a[m][n] = = *(a[m]+n) = = *(*(a+m)+n);

Приклад1. Опис вказівників.

int *ptri; //вказівник на змінну цілого типу

char *ptrc; //вказівник на змінну символьного типу

float *ptrf; //вказівник на змінну з плаваючою точкою

Такий спосіб оголошення вказівників виник внаслідок того, що змінні різних типів займають різну кількість комірок пам'яті. При цьому для деяких операцій з вказівниками необхідно знати об'єм відведеної пам'яті. Операція * в деякому розумінні є оберненою до операції &.

Вказівники використовуються для роботи з масивами. розглянемо оголошення двовимірного масиву:

int mas[4][2];

int *ptr;

Тоді вираз ptr=mas вказує на першу колонку першого рядка матриці. Записи mas і &mаs[0][0] рівносильні. Вираз ptr+1 вказує на mas[0][1], далі йдуть елементи: mas[1][0], mas[1][1], mas[2][0] і т. д.; ptr+5 вказує на mas[2][1].

Двовимірні масиви розташовані в пам’яті так само, як і одновимірні масиви, займаючи послідовні комірки пам’яті

ptr ptr+1 ptr+2 ptr+3 ptr+4 ptr+5
mas[0][0] mas[0][1] mas[1][0] mas[1][1] mas[2][0] mas[2][1]

Розміщення двовимірного масиву в пам’яті

Динамічним називається масив, розмірність якого стає відомою в процесі виконання програми.

В С++ для роботи з динамічними об’єктами використовують спеціальні операції new і delete. За допомогою операції new виділяється пам’ять під динамічний об’єкт (який створюється в процесі виконання програми), а за допомогою операції delete створений об’єкт видаляється з пам’яті.

Приклад. Виділення пам’яті під динамічний масив.

Нехай розмірність динамічного масиву вводиться з клавіатури. Спочатку необхідно виділити пам’ять під цей масив, а потім створений динамічний масив треба видалити.

int n;

scanf(n; // n — розмірність масиву

int *mas=new int[n]; // виділення пам’яті під масив

delete [] mas; // звільнення пам’яті

В цьому прикладі mas є вказівником на масив з n елементів. Оператор int *mas=new int[n] виконує дві дії: оголошується змінна типу вказівник, далі вказівнику надається адреса виділеної області пам’яті у відповідності з заданим типом об’єкта.

Для цього ж прикладу можна задати наступну еквівалентну послідовність операторів:

int n, *mas;

scanf(n;// n - розмірність масиву

mas=new int[n];// виділення пам’яті під масив

delete [] mas;// звільнення пам’яті

Якщо за допомогою операції new неможливо виділити потрібний об’єм пам’яті, то результатом операції new є 0.

Іноді при програмуванні виникає необхідність створення багатовимірних динамічних об’єктів. Програмісти-початківці за аналогією з поданим способом створення одновимірних динамічних масивів для двовимірного динамічного масиву розмірності n*k запишуть наступне

mas=new int[n][k]; // Невірно! Помилка!

Такий спосіб виділення пам’яті не дасть вірного результату. Наведемо приклад створення двовимірного масиву.

#include<iostream.h>

#include<conio.h>

int main()

{

int n;const m=5;

printf("input the number";

scanf(&n);

int** a; //a - вказівник на масив вказівників на рядки

a=new int* [n]; //виділення пам’яті для масиву вказівників на n рядків

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

a[i]=new int [m]; //виділення пам’яті для кожного рядка масиву розмірністю nxm

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

{for(int j=0;j<m;j++)

printf(a[i][j]);

}

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

delete [] a[i]; //звільнення пам’яті від кожного рядка

delete [] a; //звільнення пам’яті від масиву вказівників

getch();

return 0;

}


Информация о работе «Вказівки, масиви і символьні рядки в мові C»
Раздел: Информатика, программирование
Количество знаков с пробелами: 10707
Количество таблиц: 4
Количество изображений: 1

Похожие работы

Скачать
13173
0
9

... форматі (15 знаків), long е – довге представлення в експонентному форматі (15 знаків мантиси і 3 порядки), hex - представлення чисел в шістнадцятеричній формі; bank - представлення для грошових одиниць. Основи роботи з векторами і матрицями. Якщо необхідно задати вектор з трьох елементів, то їх значення треба перерахувати в квадратних дужках, розділяючи пропусками. Задання матриці вимагає вказі ...

Скачать
206879
0
16

... . Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив ...

Скачать
67862
1
1

... мене основним принципам побудови алгоритмів, програм, вибору структур даних. Ця дисципліна вчить мене думати, надає мені практичних знань та досвіду, щоб розробляти модель програми ще до стадії набору програми на заданій мові програмування. Ця дисципліна вчить мене тим основним речам, без яких жоден представник вибраної мною професії не може обійтись у своїй праці, тим основам, які повинні буди зі ...

Скачать
27398
0
2

... процесором, тільки коли він працює в приміщенням режимі. Метою виконання даної курсової роботи є отримання практичних навичок роботи програмування мовою асемблера. Підсумком виконання курсової роботи є розробка алгоритму контролю на парність масиву даних, що зберігається в деякій області пам'яті і програми на мові асемблера, який реалізує даний алгоритм. 1. Загальний розділ Надійність ...

0 комментариев


Наверх