130 likes | 313 Views
ПРОГРАМИРАНЕ И ИЗПОЛЗВАНЕ НА КОМПЮТРИ – II ЧАСТ Доц. д-р Юлиана Георгиева Катедра “Програмиране и компютърни технологии” Факултет Компютърни Системи и Управление. ПРЕГОВОР. УКАЗАТЕЛИ
E N D
ПРОГРАМИРАНЕ И ИЗПОЛЗВАНЕ НА КОМПЮТРИ– II ЧАСТ Доц. д-р Юлиана Георгиева Катедра “Програмиране и компютърни технологии” Факултет Компютърни Системи и Управление
ПРЕГОВОР УКАЗАТЕЛИ • Дефиницията на променлива от тип указател предизвиква в ОП да се отделят4B, в които се записва адрес, ако дефиницията е с инициализация и неопределено или NULL,ако дефиницията не е с инициализация. ОП има вида: i p q x r 12 0x00000000 1.56 int i = 12; int* p = &i; // p е инициализирано с адреса на i double *q = NULL; // q е инициализирано с нулевия указтел doublex = 1.56; double *r = &x; // r е инициализирано с адреса на x
ПРЕГОВОР УКАЗАТЕЛИ • Програмата илюстрира дефинирането и операциите за работа с указатели. #include <stdio.h> intmain() { intn = 10;// дефинира и инициализира цяла променлива int* pn = &n; // дефинира и инициализира указател pn към n // показва, че указателят сочи към n printf("n=%d,*pn=%d\n",n,*pn); // показва, че адресът на n е равен на стойността на pn printf("&n=%p,pn=%p\n",&n,pn); // намиране на стойността на m чрез pn intm = *pn; // m == 10 // промяна на стойността на n чрез pn *pn = 20; //промяна на стойността на n чрез pn printf("n=%d\n",n); return 0; } n=10,*pn=10 &n=249F:21FC,pn=249F:21FC n=20
ПРЕГОВОР УКАЗАТЕЛИ • Указател към тип void - предвиден с цел една и съща променлива - указател да може в различни моменти да сочи къмданни от различен тип. inta = 100; void* p; // дефинира указател към void p = &a; // инициализира p printf("*p=%d\n", *p); // грешка printf("*p=%d\n",*((int*) p); // преобразува p в указател към int // и тогава извлича съдържанието му.
ПРЕГОВОР УКАЗАТЕЛИИ МАСИВИ • Имената на масивите са указатели към техните “първи” елементи. Указателите се разглеждат като алтернативен начин за обхождане на елементите на даден масив. #include <stdio.h> void main() { int a[ ] = {1, 2, 3, 4, 5, 6}; int i; for (i = 0; i <= 5; i++) printf("%d\n",a[i]); for (i = 0; i <= 5; i++) printf("%d\n",*(a+i)); } а е константен указател
ПРЕГОВОР УКАЗАТЕЛИИ МАСИВИ #include <stdio.h> void main() { int a[ ] = {1, 2, 3, 4, 5, 6}; int i; for (i = 0; i <= 5; i++) { printf("%d\n",*a); a++; } } а е константен указател ГРЕШКА
ПРЕГОВОР УКАЗАТЕЛИИ МАСИВИ • Използването на указатели е по-бърз начин за достъп до елементите на масива. #include <stdio.h> void main() { int a[ ] = {1, 2, 3, 4, 5, 6}; int i; int* p = a; for (i = 0; i <= 5; i++) { printf("%d\n",*p); p++; } } p е указателпроменлива
ПРЕГОВОР УКАЗАТЕЛИИ СИМВОЛНИ НИЗОВЕ #include <stdio.h> void main() {charstr[] = "C++Language"; // str е константен указател char* pstr = str; // pstr е указател към низа str while (*pstr) {printf("%c",*pstr); pstr++; } // pstr вече не е свързан с низа “C++Language”. } str е указателконстанта pstrе указател променлива
ПРЕГОВОР ПРИМЕР • Обработка на едномерен масив от цели числа с максимален брой елементи SIZE = 100. От елементите на дадения масив xда се копират в нов масив y само зададен от потребителя брой - nbr, като копирането започва от зададена позиция - pos. • Да се използват следните функции: • 1) попълване на елементите на масив; • 2) извеждане на елементите на масив; • 3) копиране от един масив в друг на зададен брой елементи, започвайки от зададена позиция.
ПРЕГОВОР #include <stdio.h> #define SIZE 100 int in(int *a,int*n); void out(int*a,int n); void copy(int *a,int *b,int pos,int nbr); void main() { int x[SIZE], y[SIZE]; int n,nbr,pos; in(x,&n); out(x,n); printf(“Въведи брой елементи за копиране nbr="); fflush(stdin); scanf("%d",&nbr); printf(“Въведи начална позиция pos="); scanf("%d",&pos); copy(x,y,pos,nbr); out(y,nbr); } Прототипи на функциите Въведи елемент 1:2 Въведи елемент2:4 Въведи елемент3:6 Въведи елемент4:8 Въведи елемент5:10 Въведи елемент6:12 Въведи елемент7:* Въведените стойности са6 2 4 6 8 10 12 Въведи брой елементи за копиране nbr=3 Въведи начална позиция pos=2 6 8 10
ПРЕГОВОР Дефиниция на функция за попълване на елементите на масив int in(int *t, int *n) { *n=0; int temp; while( 1 ) { printf(“Въведи елемент %d:",*n+1); if(scanf("%d",&temp)==1 && *n<SIZE) { *t++=temp; (*n)++; } else { printf(“Въведените стойности са %d\n",*n); return 0; } } }
ПРЕГОВОР Дефиниция на функция за извеждане на елементите на масив void out(int *t,int n) { int i; printf("\n"); for(i=0;i<n;i++,t++) printf("%4d",*t); printf("\n"); } void copy(int *t,int *c,int pos,int nbr) { while(nbr) { *c++=*(t+pos); nbr--; t++; } } Дефиниция на функция за копиране на елементите на един масив в друг