Структурирани операнди в С/С++ Структурирани операнди в С/С++ : МАСИВИ МАСИВИ Езикът C/C++ позволява деклариране и използване на масиви, т.е. на подредени структури (списъци) от един и същ тип данни. Деклариране Деклариране на на масив масив : type arrayname [size1][size2]…[sizeN] ; type = тип на данни на елементите на масива; arrayname = име на масива; sizei = брой елементи на i-то измерение на масива. Първият елемент от i-то измерение на масив има индекс 0, а последният – sizei-1. Обемът памет, заеман от деклариран масив, се заделя от програмата веднага и е равен на произведението от броя елементи и броя байтове за елемент. Многомерните масиви се запазват в паметта по редове, т.е. най-бързо се изменя най- външният индекс, а най- бавно най-вътрешният. Примери: int arr[2][3]; char str[80’;
14
Embed
Структурирани операнди в С/С++ :МАСИВИ · 2016-11-14 · Структурирани операнди в С/С++ :МАСИВИ Езикът c/c++позволява
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: МАСИВИМАСИВИ
Езикът C/C++ позволява деклариране и използване на масиви, т.е. на подредени структури (списъци) от един
type = тип на данни на елементите на масива;arrayname = име на масива;sizei = брой елементи на i-то измерение на масива.
Първият елемент от i-то измерение на масив имаиндекс 0, а последният – sizei-1. Обемът памет, заеманот деклариран масив, се заделя от програмата веднагаи е равен на произведението от броя елементи и броябайтове за елемент. Многомерните масиви се запазватв паметта по редове, т.е. най-бързо се изменя най-външният индекс, а най- бавно най-вътрешният.
Примери:int arr[2][3];char str[80’;
Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: МАСИВИМАСИВИ
indexi = номер на елемент от i-то измерение намасива;израз = валиден израз в С/С++.
Масивите могат да се инициализират ичрез списък от съответни стойности,заграден в скоби и поставен в дясно наконструкция за присвояване.Определен елемент на масива седостига като масивът се индексира сномера на този елемент.
За да се присвои стойност на елемент от масив, се поставя масивасъс съответната индексация на този елемент от лявата страна наконструкция за присвояване. Това се нарича още инициализацияна елемента.
Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: СТРУКТУРИСТРУКТУРИ
Масивите дават възможност да се изграждат списъци от еднотипни елементи. За създаване на конгломерат (свързана
съвкупност) от две или повече променливи от различен тип се използуват структурирани операнди, наречени структури.
struct = ключова дума за дефиниране на нов тип (структурни) данни;structname = име на дефинирания нов тип (структурни) данни;type = тип на членовете на дефинирания тип (структурни) данни;memberi = име на i-тия член на дефинирания тип (с) данни, i=1,…N;
Променливите, които съставят структурата, сенаричат нейни членове (или елементи).Обикновено информацията, съхранявана вструктура, е логически свързана и е добре дасе разбере, че декларацията на структуратапросто дефинира едно логическо цяло.
Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: СТРУКТУРИСТРУКТУРИ
struct structname var1,var2,…,varM ;structname = име на дефиниран вече тип(структурни) данни;varj = име на j-тa декларирана структура от типstructname, j=1,…,M;
След като една структура е дефинирана, тя може да се ползва в ролята на “тип на данни структура” , за да се декларират чрез
нея реални нейни инстанции-структури (проявления, реализации), на които се дават конкретни имена.
Възможно е структура да се вложи като член на друга структура, като тогава достъпа е от външно-обхващаща към вътрешно-
вложена, ползвайки оператора “.”.
След като имаме вече и реални инстанции-структури (проявления,реализации) с конкретни имена, можем да ги ползваме за даинициализираме самите структури и по точно техните членове. Товастава като в лявата страна на конструкция за присвояване се поставиимето на инстанция на структурата, последвано от оператора “.” иимето на неин член, а отдясно – стойността, която се присвоява.
Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: ОБЕДИНЕНИЯОБЕДИНЕНИЯ
Обединенията са част от паметта, която се поделя при съхранение на две или повече променливи. Променливите, поделящи паметта могат да са от различни типове. Във всеки един момент обаче може да се
ползва само една променлива от състава на обединението. ДефиниранеДефиниране нана (нов)(нов) типтип обединениеобединение:
union unionname {type member1,…,type memberN} ;union = ключова дума за дефиниране на нов типобединение;unionname = име на дефинирания нов тип обединение;type = тип на данни на членовете на дефинирания типобединение;memberi = име на i-тия член на дефинирания типобединение, i=1,…N;
Пример:union studentMark{ int mark; char markName[7]; double points}
Структурирани операнди в С/С++ Структурирани операнди в С/С++ :: ОБЕДИНЕНИЯОБЕДИНЕНИЯ
Деклариране на инстанция от новодефиниран тип Деклариране на инстанция от новодефиниран тип обединение обединение :
union unionname var1,var2,…,varM ;unionname = име на дефиниран вече тип обединение;varj = име на j-тa декларирана структура от типобединение, j=1,…,M;
След като едно обединение е дефинирано, то може да се ползва в ролята на “тип на данни обединение”, за да се декларират
чрез него реални негови инстанции - обединения (проявления, реализации), на които се дават конкретни имена.
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Пример
След като имаме вече и реални инстанции - обединения(проявления, реализации) с конкретни имена, можем да ги ползвамеза да инициализираме техните членове. Това става като в ляватастрана на конструкция за присвояване се постави името наинстанция на обединението, последвано от оператора “.” и името нанегов член, а отдясно – стойността, която се присвоява.
type = тип на данните, към които сочи указателят;pointername = името на указателя.
int *pi,*p; char *s;float *pf;double *pd;
Примери
Указателят е променлива, съдържаща адреса в паметта на някакъв обект.
Езикът С съдържа два специални “указателни” оператора - “&”и “*”. Първият връща адреса на променливата стояща следнего. Вторият връща стойността, съхранявана на адреса, койтоследва този оператор.
УКАЗАТЕЛИУКАЗАТЕЛИ
Инициализиране на указател:Инициализиране на указател:int a,c; pi = &a; или pd = NULL; !
NULL е празна стойност за инициализиране на указател,дефинирана в <stdio.h> и означава, че указателят не сочиникъде. Ако опитате да ползвате указател преди да му еприсвоен адрес на променлива, програмата вероятно щедаде грешка. Това е така, защото декларацията на указателпросто създава променлива, имаща възможност дасъдържа адрес от паметта, но все още не съдържащареален такъв !!!
Преди да се ползва, указателят трябва да се инициализира, т.е да му се присвои адрес на променлива. В противен случай той би могъл да сочи какво ли не, което
може да доведе до неприятни последствия !
УКАЗАТЕЛИУКАЗАТЕЛИ
ПРИМЕРИ:a=11; p=&a; // p = адреса на аfloat b; b=1.; pf=&b;// pf = адреса на bc=3; p=&c; *p=10; // c=?
Достъпът до стойност на променлива чрез името й, се нарича директендиректен.
Достъпът до стойност на променлива чрез указател, се нарича индиректениндиректен.
Указателен оператор за адрес &&операнд - връща адреса на операнда, стоящ след него
Указателен оператор за стойност **операнд - връща стойността, съхранявана на адреса,
указан от операнда
УКАЗАТЕЛИУКАЗАТЕЛИ
“Указателната” аритметика позволява само операторите “+” и“-” за събиране и изваждане на указатели (адреси), както и “--”или “++” за декрементиране или инкрементиране на указател(адрес), но “единицата” му на нарастване (или намаляване)представлява онова количество байтове, което се изисква отнеговия базов тип. Например, ако указател p към целочисленоперанд съдържа адрес 2000, след p++ той ще съдържа 2004.
Указателите се ползват както променливите, но с някои ограничения и правила .
Изваждане на указатели привзаимна връзка - намира се броят наелементите помежду им.
УКАЗАТЕЛИУКАЗАТЕЛИ
Забележка 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 байта, което е грешка.
Побитовите полета са част от паметта, вариант на структурно поле отбитове. Тоест, това е част от паметта, която се състои от един илиповече битове. Чрез използването на побитовите полета сепредоставя възможност за достъп до един или повече бита от байтили дума, посредство само едно име.