Покажувачи и структури

 

 

Што се покажувачи?
посебен тип на променливи кои  претставуваат адреса на (друга) мемориска локација т.е. покажуваат кон мемориската локација на дадената адреса.

Користењето на променливи од тип покажувач нуди две битни погодности во однос на меморијата: 
1. Се проширува меморискиот простор што може да се користи за податоци во една програма 
2. Со користење на покажувачките променливи во динамичката меморија, програмата може да се извршува со помала количина неопходна меморија.
На пример, програмата може да поседува две многу сложени структури на податоци што не се користат истовремено. Ако овие две структури се декларираат како глобални променливи, тогаш тие се наоѓаат во сегментот за податоци и завземаат меморија за цело време на извршувањето на програмата, без оглед дали се користат во моментот или не.
Но, ако се дефинирани преку покажувачи (динамички), тие се наоѓаат во динамичката меморија и ќе бидат избришани од неа по престанокот на нивното користење 

Програма со која се демонстрира како да декларирате и користите Структурни покажувачи во C++

#include<iostream>
using namespace std;

struct date {
   short int dd, mm, yy;
   } join_date = {19, 12, 2006};

int main()
{
   date *date_ptr;
   date_ptr = &join_date;
   cout<<"Printing the structure elements using the structure variable\n";
   cout<<"dd = "<<join_date.dd<<", mm = "<<join_date.mm<<", yy = "<<join_date.yy<<"\n";
   cout<<"\nPrinting the structure elements using the structure pointer\n";
   cout<<"dd = "<<date_ptr->dd<<", mm = "<<date_ptr->mm<<", yy = "<<date_ptr->yy<<"\n";
   return 0;
}
Output
Printing the structure elements using the structure variable
dd = 19, mm = 12, yy = 2006

Printing the structure elements using the structure pointer
dd = 19, mm = 12, yy = 2006

Покажувачи на структура

Pointer променливата може да се креира не само за типови податоци како што се (int, float, double итн.), туку и за типови дефинирани од корисникот,  како  на пример структура.

Покажувач на структура во C++ е дефиниран како покажувач кој укажува на адресата на меморискиот блок што складира структура. 

Пример 

struct tocka
{ int x;
int y; } t1, *tt1;

t1 е променлива од тип struct tocka, a tt1 е покажувач на структура од тип tocka. 

Покажувач може да се иницијализира со адресата на променливата: tt1= &t1;

Syntax:

struct name_of_structure *ptr; 
 // Initialization of structure is done as shown below 
 ptr = &structure_variable;

// C++ program to demonstrate Pointer to Structure
#include <iostream>
using namespace std;

struct point {
int value;
};

int main()
{
struct point g;                             // g e instanca-primerok  od strukturata point 
// Initialization of the structure pointer
struct point* ptr = &g;              // ptr e structure pointer - pokazuvac na struktura point 
                                                 
return 0;
}

Пример 1 :

#include <iostream>
using namespace std;
struct Distance {
int feet;
float inch;
};

int main() {
Distance *ptr, d; // pointer variable *ptr i promenliva od tipot struct
ptr = &d;            // adresata na promenlivata d se skladira vo poiner variable
cout << "Enter feet: ";
cin >> (*ptr).feet; // pristap vo clenkata feed preku pointer
cout << "Enter inch: ";
cin >> (*ptr).inch;
cout << "Displaying information." << endl;
cout << "Distance = " << (*ptr).feet << " feet " << (*ptr).inch << " inches";
return 0;
}

Бидејќи покажувачот ptr покажува на променливата d, (*ptr).inch и d.inch се еквивалентни. Слично, (*ptr).feet и d.feet се еквивалентни.  

Ако користиме покажувачи, пожелно е да пристапиме до членовите на структурата користејќи го операторот ->  (arrow operator)

Бидејќи . (dot operator) операторот има поголем приоритет од операторот *,   *ptr го ставаме во загради , користиме (*ptr).inch. Поради ова, полесно е да се прават грешки ако двата оператори се користат заедно во еден код.

ptr->feet е исто со (*ptr).feet

ptr->inch е исто со (*ptr).inc

Пример 2:

#include <iostream>
using namespace std;
 
// Structure declaration for  teminja
struct GFG {
    int x;
    int y;
};
 
// Structure declaration for  Square
struct square {
 
    // An object left is declare with 'GFG'
    struct GFG left;
     // An object right is declared with 'GFG'
    struct GFG right;
};
 
// Function to calculate area of  the given Square
void area_Square(struct square s)
{
    // Find the area of the Square
    //using variables of point
    // structure where variables of
    // point structure is accessed
    // by left and right objects
    int area = (s.right.x) * (s.left.x);
     // Print the area
    cout << area << endl;
}
 
// Driver Code
int main()
{
    // Initialize variable 's'
    // with vertices of Square
    struct square s = { { 4, 4 }, { 4, 4 } };
     // Function Call
    area_Square(s);
     return 0;
}
Output :
16

Пример 3:
#include<iostream>
using namespace std;

struct emp
{
   int empId;
   string empName;
   float empBasic;
   float empExperience;
};

void display(emp *e);
void increase(emp *e);

int main()
{
   emp mgr, *eptr;
   cout<<"Enter the employee ID: ";
   cin>>mgr.empId;
   cout<<"Enter the name: ";
   cin>>mgr.empName;
   cout<<"Enter basic pay: ";
   cin>>mgr.empBasic;
   cout<<"Enter the experience (in years): ";
   cin>>mgr.empExperience;
   eptr = &mgr;
   cout<<"\nEmployee details before increase()\n";
   display(eptr);
   increase(eptr);
   cout<<"\nEmployee details after increase()\n";
   display(eptr);
   cout<<endl;
   return 0;
}

void display(emp *e)
{
   int len = (e->empName).size();
   cout<<"Employee ID: "<<e->empId;
   cout<<"\nName: "<<e->empName;
   cout<<"\tBasic: "<<e->empBasic;
   cout<<"\tExperience: "<<e->empExperience<<" years\n";
}

void increase(emp *e)
{
   if(e->empExperience >= 5)
   {
      e->empBasic = e->empBasic + 15000;
   }
}

Задачи :
1. Програма со која се внесува и прикажува број на индекс, име, презиме и година на студии на студент

#include <iostream>
 using namespace std;
 
struct student
{
 int index;
 string ime;
 string prezime;
 int godstudii;
};
int main()
{
 student s1;
 student *sp=&s1;
 cout << "vnesi broj na indeks, ime, prezime i god na studii na student" << endl;
 cin>>sp->index>>sp->ime>>sp->prezime>>sp->godstudii;
 cout<<"vneseno e "<<endl;
 cout<< sp->index<<" "<<sp->ime<<" "<<sp->prezime<<" "<<sp->godstudii;
 return 0;
}

2. Програма со која се внесуваат податоци за n студенти. Студентот е структура составен од
име, презиме , број на индекс и просек. Да се подреди списокот на студенти по просек во
опаѓачки редослед. Да се користат покажувачи кон членовите на структурата.
#include <iostream>
using namespace std;
struct student
{
 int index;
 string ime;
 string prezime;
 float prosek;
};
int main()
{
 student s1[1000];
 student *sp=s1;
 int n,j,i;
 cout<<"vnesi broj na studenti"<<endl;
 cin>>n;
 for (i=0;i<n;i++)
 {
 cout << "vnesi broj na indeks, ime, prezime i prosek na student" << endl;
 cin>>(sp+i)->index>>(sp+i)->ime>>(sp+i)->prezime>>(sp+i)->prosek;
 }
 for (i=0;i<n-1;i++)
 {
 for(j=i+1;j<n;j++)
 {
  if(((sp+i)->prosek) < ((sp+j)->prosek))
   {
    swap( *(sp+i),*(sp+j));
      }
  }
 }
 cout<<"spisokot e "<<endl;
 for (i=0;i<n;i++)
 {
 cout<< (sp+i)->index<<" "<<(sp+i)->ime<<" "<<(sp+i)->prezime<<" "<<(sp+i)->prosek<<endl;
 }
 return 0;
}

No comments: