Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 ·...

14
Структурирани операнди в С/С++ Структурирани операнди в С/С++ : МАСИВИ МАСИВИ Езикът C/C++ позволява деклариране и използване на масиви, т.е. на подредени структури (списъци) от един и същ тип данни. Деклариране Деклариране на на масив масив : type arrayname [size1][size2]…[sizeN] ; type = тип на данни на елементите на масива; arrayname = име на масива; sizei = брой елементи на i-то измерение на масива. Първият елемент от i-то измерение на масив има индекс 0, а последният – sizei-1. Обемът памет, заеман от деклариран масив, се заделя от програмата веднага и е равен на произведението от броя елементи и броя байтове за елемент. Многомерните масиви се запазват в паметта по редове, т.е. най-бързо се изменя най- външният индекс, а най- бавно най-вътрешният. Примери: int arr[2][3]; char str[80’;

Transcript of Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 ·...

Page 1: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: МАСИВИМАСИВИ

Езикът C/C++ позволява деклариране и използване на масиви, т.е. на подредени структури (списъци) от един

и същ тип данни.

ДеклариранеДеклариране нана масивмасив:type arrayname [size1][size2]…[sizeN];

type = тип на данни на елементите на масива;arrayname = име на масива;sizei = брой елементи на i-то измерение на масива.

Първият елемент от i-то измерение на масив имаиндекс 0, а последният – sizei-1. Обемът памет, заеманот деклариран масив, се заделя от програмата веднагаи е равен на произведението от броя елементи и броябайтове за елемент. Многомерните масиви се запазватв паметта по редове, т.е. най-бързо се изменя най-външният индекс, а най- бавно най-вътрешният.

Примери:int arr[2][3];char str[80’;

Page 2: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: МАСИВИМАСИВИ

ИнициализиранеИнициализиране нана масивмасив:arrayname [index1][index2]…[indexN]=израз;

indexi = номер на елемент от i-то измерение намасива;израз = валиден израз в С/С++.

Масивите могат да се инициализират ичрез списък от съответни стойности,заграден в скоби и поставен в дясно наконструкция за присвояване.Определен елемент на масива седостига като масивът се индексира сномера на този елемент.

Примери:arr[2][3]={0,1,2,3,4,5};

аrr[0][0]=?аrr[0][1]=?аrr[0][2]=?аrr[1][0]=?аrr[1][1]=?аrr[1][2]=?

arr[1][2]=8; =>arr[?][?]=8

За да се присвои стойност на елемент от масив, се поставя масивасъс съответната индексация на този елемент от лявата страна наконструкция за присвояване. Това се нарича още инициализацияна елемента.

Page 3: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: СТРУКТУРИСТРУКТУРИ

Масивите дават възможност да се изграждат списъци от еднотипни елементи. За създаване на конгломерат (свързана

съвкупност) от две или повече променливи от различен тип се използуват структурирани операнди, наречени структури.

ДефиниранеДефиниране нана новнов типтип (структурни)(структурни) данниданни:struct structname {type member1;…;type memberN;} ;

struct = ключова дума за дефиниране на нов тип (структурни) данни;structname = име на дефинирания нов тип (структурни) данни;type = тип на членовете на дефинирания тип (структурни) данни;memberi = име на i-тия член на дефинирания тип (с) данни, i=1,…N;

Пример:struct student{int fNumber;char name[40];int kurs;}

Променливите, които съставят структурата, сенаричат нейни членове (или елементи).Обикновено информацията, съхранявана вструктура, е логически свързана и е добре дасе разбере, че декларацията на структуратапросто дефинира едно логическо цяло.

Page 4: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: СТРУКТУРИСТРУКТУРИ

ДеклариранеДеклариране нана операндоперанд (структура)(структура) отот типтип(структурни) данни:

struct structname var1,var2,…,varM ;structname = име на дефиниран вече тип(структурни) данни;varj = име на j-тa декларирана структура от типstructname, j=1,…,M;

След като една структура е дефинирана, тя може да се ползва в ролята на “тип на данни структура” , за да се декларират чрез

нея реални нейни инстанции-структури (проявления, реализации), на които се дават конкретни имена.

Пример:struct student student1, student2, student3;struct student studenti[20];

Page 5: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: СТРУКТУРИСТРУКТУРИ

ИнициализиранеИнициализиране нана деклариранадекларирана вечевече структураструктура:varj.memberi=израз;

struct catalog {char autor[40];char title[40];unsigned date;} card1,card2;

card1.autor=“C.Bayron”;cin>>card1.title;struct catalog card3;card2=card1;card3.date=1776;

cout<<card2.autor[2];card3.title=card2.title;struct catalog card[100];card[0].date=1875;catalog function(void);

ПримериПримери Примери

Възможно е структура да се вложи като член на друга структура, като тогава достъпа е от външно-обхващаща към вътрешно-

вложена, ползвайки оператора “.”.

След като имаме вече и реални инстанции-структури (проявления,реализации) с конкретни имена, можем да ги ползваме за даинициализираме самите структури и по точно техните членове. Товастава като в лявата страна на конструкция за присвояване се поставиимето на инстанция на структурата, последвано от оператора “.” иимето на неин член, а отдясно – стойността, която се присвоява.

Page 6: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: ОБЕДИНЕНИЯОБЕДИНЕНИЯ

Обединенията са част от паметта, която се поделя при съхранение на две или повече променливи. Променливите, поделящи паметта могат да са от различни типове. Във всеки един момент обаче може да се

ползва само една променлива от състава на обединението. ДефиниранеДефиниране нана (нов)(нов) типтип обединениеобединение:

union unionname {type member1,…,type memberN} ;union = ключова дума за дефиниране на нов типобединение;unionname = име на дефинирания нов тип обединение;type = тип на данни на членовете на дефинирания типобединение;memberi = име на i-тия член на дефинирания типобединение, i=1,…N;

Пример:union studentMark{ int mark; char markName[7]; double points}

Page 7: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: ОБЕДИНЕНИЯОБЕДИНЕНИЯ

Деклариране на инстанция от новодефиниран тип Деклариране на инстанция от новодефиниран тип обединение обединение :

union unionname var1,var2,…,varM ;unionname = име на дефиниран вече тип обединение;varj = име на j-тa декларирана структура от типобединение, j=1,…,M;

След като едно обединение е дефинирано, то може да се ползва в ролята на “тип на данни обединение”, за да се декларират

чрез него реални негови инстанции - обединения (проявления, реализации), на които се дават конкретни имена.

Пример:union studentMark student1Mark, student2Mark, student3Mark;union studentMark ocenki[20];

Page 8: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: ОБЕДИНЕНИЯОБЕДИНЕНИЯ

ИнициализиранеИнициализиране нана деклариранодекларирано обединениеобединение:varj.memberi=израз;

union unionType{int i;char c[2];double d;} sample;

Пример

Обединенията могат да се ползват за кодиране/декодиране на информация.

****

****

****

****

****

****

****

****

****

****

****

****

adr

adr-

1

adr-

2

adr-

3

adr-

4

adr-

5

adr-

6

adr-

7

adr-

8

adr-

9

adr-

10

adr-

11

id

c[0] c[1]

sample.d=123.098Пример

След като имаме вече и реални инстанции - обединения(проявления, реализации) с конкретни имена, можем да ги ползвамеза да инициализираме техните членове. Това става като в ляватастрана на конструкция за присвояване се постави името наинстанция на обединението, последвано от оператора “.” и името нанегов член, а отдясно – стойността, която се присвоява.

Page 9: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

УКАЗАТЕЛИУКАЗАТЕЛИ

ДеклариранеДеклариране нана указателуказател:type *pointername;

type = тип на данните, към които сочи указателят;pointername = името на указателя.

int *pi,*p; char *s;float *pf;double *pd;

Примери

Указателят е променлива, съдържаща адреса в паметта на някакъв обект.

Езикът С съдържа два специални “указателни” оператора - “&”и “*”. Първият връща адреса на променливата стояща следнего. Вторият връща стойността, съхранявана на адреса, койтоследва този оператор.

Page 10: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

УКАЗАТЕЛИУКАЗАТЕЛИ

Инициализиране на указател:Инициализиране на указател:int a,c; pi = &a; или pd = NULL; !

NULL е празна стойност за инициализиране на указател,дефинирана в <stdio.h> и означава, че указателят не сочиникъде. Ако опитате да ползвате указател преди да му еприсвоен адрес на променлива, програмата вероятно щедаде грешка. Това е така, защото декларацията на указателпросто създава променлива, имаща възможност дасъдържа адрес от паметта, но все още не съдържащареален такъв !!!

Преди да се ползва, указателят трябва да се инициализира, т.е да му се присвои адрес на променлива. В противен случай той би могъл да сочи какво ли не, което

може да доведе до неприятни последствия !

Page 11: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

УКАЗАТЕЛИУКАЗАТЕЛИ

ПРИМЕРИ:a=11; p=&a; // p = адреса на аfloat b; b=1.; pf=&b;// pf = адреса на bc=3; p=&c; *p=10; // c=?

Достъпът до стойност на променлива чрез името й, се нарича директендиректен.

Достъпът до стойност на променлива чрез указател, се нарича индиректениндиректен.

Указателен оператор за адрес &&операнд - връща адреса на операнда, стоящ след него

Указателен оператор за стойност **операнд - връща стойността, съхранявана на адреса,

указан от операнда

Page 12: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

УКАЗАТЕЛИУКАЗАТЕЛИ

“Указателната” аритметика позволява само операторите “+” и“-” за събиране и изваждане на указатели (адреси), както и “--”или “++” за декрементиране или инкрементиране на указател(адрес), но “единицата” му на нарастване (или намаляване)представлява онова количество байтове, което се изисква отнеговия базов тип. Например, ако указател p към целочисленоперанд съдържа адрес 2000, след p++ той ще съдържа 2004.

pi++; p=&a; a=pi-p; a=?b=1.; pf=&b; pf--; a=&b-pf; a=?p=&c; *p=10; c=?

Указателите се ползват както променливите, но с някои ограничения и правила .

Изваждане на указатели привзаимна връзка - намира се броят наелементите помежду им.

Page 13: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

УКАЗАТЕЛИУКАЗАТЕЛИ

Забележка 1: Указателят се пази в една машинна дума от 4 байта (за 32-битовите компютри), без значение типа данни, който указва.

(*p)++; c=?

*p++; c=?

p=p+b; p=?

p=p+2; p=?

p=p*4; p=?*s=“hello”;cout<<s; ???

pf=1000;

pf=pf+1; pf=?

Възможно е операторът “*” да се ползва в лявата страна на изразза присвояване, при което се присвоява нова стойност напроменливата, която той “индиректно” сочи. Възможна е имножествена индиректност: char **str;

pd=&a; *pd=1.2; Коректно ли е ?

Базовият тип на указателя указва как ще се обработва соченият отнего обект, като е важна приемствеността на типовете данни.

Типът int е по-къс от double и инструкцията за присвояване щепрепокрие паметта, където се намира променливата a (2 байта) инамиращите се в съседство с нея 6 байта, което е грешка.

Page 14: Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява

СТРУКТУРИРАНИ ОПЕРАНДИ: ПОБИТОВИ ПОЛЕТАСТРУКТУРИРАНИ ОПЕРАНДИ: ПОБИТОВИ ПОЛЕТА

Побитовите полета са част от паметта, вариант на структурно поле отбитове. Тоест, това е част от паметта, която се състои от един илиповече битове. Чрез използването на побитовите полета сепредоставя възможност за достъп до един или повече бита от байтили дума, посредство само едно име.

ДефиниранеДефиниране нана побитовопобитово полеполе:type fieldName : size ;

type = тип на данни, който е или int или unsigned. ;fieldName = име на побитовото поле;Size = задава броя на битове в побитовото поле.

Пример:struct facultyType{unsigned departmentCode:3; //до 7 департаментаunsigned action:1; // 1=active, 0=inactiveint staffCount:4; // брой на служителите}