Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

Подобни документи
Програмиране на Паскал

Сериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23

C++

Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр

Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве

Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1

Маисви

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 9 ноември 2016 г. Триф

Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма

Проф

Програмен език C Пламен Танов Ненко Табаков Мартин Вачовски Технологично училище Електронни системи Технически университет София версия 0.5

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

Lush Green

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

Рекурсия Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. 4 януари

Структура на програма в C - Част 9 - низове от символи, C-string

2. Наследяване в C++ Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 1 февруари 2007 г. 1 Наследяване 1 2

Lush Green

Black and White

3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението

Обработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Re

2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет

Структура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор

Виртуални функции

ИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври

МИНИСТЕРСТВО НА ОБРАЗОВАНИЕТО И НАУКАТА

Структура на програма в C - Част 2 - типове, функции

Лабораторно упражнение 6 Тема: Оператори за цикли в езика C++. Реализиране на циклични алгоритми I. Цел на лабораторното упражнение Да се затвърдят зн

Структура на програма в C - Част 6 - goto, switch, break и continue клаузи

ОСНОВИ НА ЕЗИКА С# Интеграция на езиците за програмиране Една от най-добрите черти на.net Framework е възможността за интеграция на множество езици за

Потоци (Rev: 1.1)

Homework 2

Kontrolno 5, variant 1

Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/

Homework 3

Лекции по Програмиране първа част I. Въведение в компютрите и програмирането КОМПЮТЪР = АПАРАТУРА + ПРОГРАМНО ОСИГУРЯВАНЕ Апаратна част Hardware(Харду

Упражнение 3. Основни елементи на РНР синтаксис на езика, константи, променливи, изрази, оператори... Показване на текст в браузъра Да се създаде една

Входно/изходните операции са разширяеми. Лесно се реализират входно/изходни операции за типове, дефинирани от потребителя. Потоци (Rev: 1.1) Любомир Ч

Канонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно и

Анализ и оптимизация на софтуерни приложения

Microsoft Word - Lection06.doc

Лабораторно упражнение 4 Тема : Реализиране на линейни програми.. I. Цел на лабораторното упражнение Аритметични и логически операции в програмният ез

-

Препис:

Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23

Указатели! Калин Георгиев Увод в програмирането 21 декември 2016 г. 2 / 23

Дефиниране long a=1,b =2; long *pi = &a;... 1 2 100... Калин Георгиев Увод в програмирането 21 декември 2016 г. 3 / 23

Операции: през указател, С указател *pi = 10;... 1 2 100...... 10 2 100... pi = 104; // won t compile // pi =&b; // pi =( long *)104; *pi = 104;... 10 2 104...... 10 104 104... Калин Георгиев Увод в програмирането 21 декември 2016 г. 4 / 23

Операции: през указател, С указател *pi = 10;... 1 2 100...... 10 2 100... pi = 104; // won t compile // pi =&b; // pi =( long *)104; *pi = 104;... 10 2 104...... 10 104 104... Калин Георгиев Увод в програмирането 21 декември 2016 г. 4 / 23

Операции: през указател, С указател *pi = 10;... 1 2 100...... 10 2 100... pi = 104; // won t compile // pi =&b; // pi =( long *)104; *pi = 104;... 10 2 104...... 10 104 104... Калин Георгиев Увод в програмирането 21 декември 2016 г. 4 / 23

Операции: през указател, С указател *pi = 10;... 1 2 100...... 10 2 100... pi = 104; // won t compile // pi =&b; // pi =( long *)104; *pi = 104;... 10 2 104...... 10 104 104... Калин Георгиев Увод в програмирането 21 декември 2016 г. 4 / 23

Операции: през указател, С указател *pi = 10;... 1 2 100...... 10 2 100... pi = 104; // won t compile // pi =&b; // pi =( long *)104; *pi = 104;... 10 2 104...... 10 104 104... Калин Георгиев Увод в програмирането 21 декември 2016 г. 4 / 23

Операции: през указател, С указател *pi = 10;... 1 2 100...... 10 2 100... pi = 104; // won t compile // pi =&b; // pi =( long *)104; *pi = 104;... 10 2 104...... 10 104 104... Калин Георгиев Увод в програмирането 21 декември 2016 г. 4 / 23

Пример с функции void f ( long x) x = x + 10; // (2 ) cout << x; void g ( long *px) *px = *px + 10; // (5) cout << *px; long main () long x = 0; // (1) f(x); // (2) cout << x; // (3) g (&x); // (4) cout << x; // (6) (1)main: (2,2 )main: f: x 10 (3)main: (4)main: g: px 100 (5)main: x 10 g: px 100 (6)main: x 10 Калин Георгиев Увод в програмирането 21 декември 2016 г. 5 / 23

Пример с функции void f ( long x) x = x + 10; // (2 ) cout << x; void g ( long *px) *px = *px + 10; // (5) cout << *px; long main () long x = 0; // (1) f(x); // (2) cout << x; // (3) g (&x); // (4) cout << x; // (6) (1)main: (2,2 )main: f: x 10 (3)main: (4)main: g: px 100 (5)main: x 10 g: px 100 (6)main: x 10 Калин Георгиев Увод в програмирането 21 декември 2016 г. 5 / 23

Пример с функции void f ( long x) x = x + 10; // (2 ) cout << x; void g ( long *px) *px = *px + 10; // (5) cout << *px; long main () long x = 0; // (1) f(x); // (2) cout << x; // (3) g (&x); // (4) cout << x; // (6) (1)main: (2,2 )main: f: x 10 (3)main: (4)main: g: px 100 (5)main: x 10 g: px 100 (6)main: x 10 Калин Георгиев Увод в програмирането 21 декември 2016 г. 5 / 23

Пример с функции void f ( long x) x = x + 10; // (2 ) cout << x; void g ( long *px) *px = *px + 10; // (5) cout << *px; long main () long x = 0; // (1) f(x); // (2) cout << x; // (3) g (&x); // (4) cout << x; // (6) (1)main: (2,2 )main: f: x 10 (3)main: (4)main: g: px 100 (5)main: x 10 g: px 100 (6)main: x 10 Калин Георгиев Увод в програмирането 21 декември 2016 г. 5 / 23

Пример с функции void f ( long x) x = x + 10; // (2 ) cout << x; void g ( long *px) *px = *px + 10; // (5) cout << *px; long main () long x = 0; // (1) f(x); // (2) cout << x; // (3) g (&x); // (4) cout << x; // (6) (1)main: (2,2 )main: f: x 10 (3)main: (4)main: g: px 100 (5)main: x 10 g: px 100 (6)main: x 10 Калин Георгиев Увод в програмирането 21 декември 2016 г. 5 / 23

Пример с функции void f ( long x) x = x + 10; // (2 ) cout << x; void g ( long *px) *px = *px + 10; // (5) cout << *px; long main () long x = 0; // (1) f(x); // (2) cout << x; // (3) g (&x); // (4) cout << x; // (6) (1)main: (2,2 )main: f: x 10 (3)main: (4)main: g: px 100 (5)main: x 10 g: px 100 (6)main: x 10 Калин Георгиев Увод в програмирането 21 декември 2016 г. 5 / 23

Пример с функции void f ( long x) x = x + 10; // (2 ) cout << x; void g ( long *px) *px = *px + 10; // (5) cout << *px; long main () long x = 0; // (1) f(x); // (2) cout << x; // (3) g (&x); // (4) cout << x; // (6) (1)main: (2,2 )main: f: x 10 (3)main: (4)main: g: px 100 (5)main: x 10 g: px 100 (6)main: x 10 Калин Георгиев Увод в програмирането 21 декември 2016 г. 5 / 23

Параметър по стойност vs. по указател long division ( long x, long y, long * remainder ) * remainder = x - (x/y)*y; return x/ y; long main () long r = 0; cout << " [14/4]= " << division (14,4,& r) << " 14/4 = " << r << endl ; Калин Георгиев Увод в програмирането 21 декември 2016 г. 6 / 23

Какво е нередно в този пример? long division ( long x, long y, long * remainder )... cout << division (2,2,0); Калин Георгиев Увод в програмирането 21 декември 2016 г. 7 / 23

Масиви и указатели Калин Георгиев Увод в програмирането 21 декември 2016 г. 8 / 23

Какво е a? Какво е arr? long a = 5; b = 10; long arr [3] = 1,2,3; arr2 [3] = 4,5,6; а и b: заместител на адреса / наименование на буфера a = 2; a = a + 3; b = a + b; if (a > b)... Операциите с масиви са операции с елементите им Отеделните елементи имат свойства на обикновени променливи от съответния тип arr [0] = 2; arr [0] = arr [1] + 3;... Какво са arr и arr2 сами по себе си? arr =???; arr2 = arr???; if ( arr > arr2 )??? Калин Георгиев Увод в програмирането 21 декември 2016 г. 9 / 23

Какво е a? Какво е arr? long a = 5; b = 10; long arr [3] = 1,2,3; arr2 [3] = 4,5,6; а и b: заместител на адреса / наименование на буфера a = 2; a = a + 3; b = a + b; if (a > b)... Операциите с масиви са операции с елементите им Отеделните елементи имат свойства на обикновени променливи от съответния тип arr [0] = 2; arr [0] = arr [1] + 3;... Какво са arr и arr2 сами по себе си? arr =???; arr2 = arr???; if ( arr > arr2 )??? Калин Георгиев Увод в програмирането 21 декември 2016 г. 9 / 23

Какво е a? Какво е arr? long a = 5; b = 10; long arr [3] = 1,2,3; arr2 [3] = 4,5,6; а и b: заместител на адреса / наименование на буфера a = 2; a = a + 3; b = a + b; if (a > b)... Операциите с масиви са операции с елементите им Отеделните елементи имат свойства на обикновени променливи от съответния тип arr [0] = 2; arr [0] = arr [1] + 3;... Какво са arr и arr2 сами по себе си? arr =???; arr2 = arr???; if ( arr > arr2 )??? Калин Георгиев Увод в програмирането 21 декември 2016 г. 9 / 23

Какво е a? Какво е arr? long a = 5; b = 10; long arr [3] = 1,2,3; arr2 [3] = 4,5,6; а и b: заместител на адреса / наименование на буфера a = 2; a = a + 3; b = a + b; if (a > b)... Операциите с масиви са операции с елементите им Отеделните елементи имат свойства на обикновени променливи от съответния тип arr [0] = 2; arr [0] = arr [1] + 3;... Какво са arr и arr2 сами по себе си? arr =???; arr2 = arr???; if ( arr > arr2 )??? Калин Георгиев Увод в програмирането 21 декември 2016 г. 9 / 23

Указател към първия елемент long arr [3] = 1,2,3; arr... *arr 80 100... 1 2 3... Калин Георгиев Увод в програмирането 21 декември 2016 г. 10 / 23

Указател към първия елемент long arr [3] = 1,2,3; arr... *arr 80 100... 1 2 3... Калин Георгиев Увод в програмирането 21 декември 2016 г. 10 / 23

Операции arr... *arr 80 100... 1 2 3... Отново писане и четене през указател * arr = 10; cout << * arr ; arr... *arr 80 100... 10 2 3... Калин Георгиев Увод в програмирането 21 декември 2016 г. 11 / 23

Операции arr... *arr 80 100... 1 2 3... Отново писане и четене през указател * arr = 10; cout << * arr ; arr... *arr 80 100... 10 2 3... Калин Георгиев Увод в програмирането 21 декември 2016 г. 11 / 23

Адресна аритметика arr... *arr 80 100... 10 2 3... Аритметични операции с указател: <указател>+<ест. число>=<указател> *( arr +2) = 10; arr... *arr 80 100... 10 2 10... Калин Георгиев Увод в програмирането 21 декември 2016 г. 12 / 23

Адресна аритметика arr... *arr 80 100... 10 2 3... Аритметични операции с указател: <указател>+<ест. число>=<указател> *( arr +2) = 10; arr... *arr 80 100... 10 2 10... Калин Георгиев Увод в програмирането 21 декември 2016 г. 12 / 23

Още за адресната аритметика arr... *arr 80 100... 10 2 10... arr+i == &arr[i] *(arr+i) <==> arr[i] (long)(arr+1)==104 //!= 101 char chararr [6] = " Hello "; (long)(chararr+1) - (long)(chararr+2) == 1 == sizeof(char) (long)(arr+1) - (long)(arr+2) == 4 == sizeof(long) Слеводателно arr[i] <==> *(arr+i), независимо от размера на елементите Калин Георгиев Увод в програмирането 21 декември 2016 г. 13 / 23

Още за адресната аритметика arr... *arr 80 100... 10 2 10... arr+i == &arr[i] *(arr+i) <==> arr[i] (long)(arr+1)==104 //!= 101 char chararr [6] = " Hello "; (long)(chararr+1) - (long)(chararr+2) == 1 == sizeof(char) (long)(arr+1) - (long)(arr+2) == 4 == sizeof(long) Слеводателно arr[i] <==> *(arr+i), независимо от размера на елементите Калин Георгиев Увод в програмирането 21 декември 2016 г. 13 / 23

Още за адресната аритметика arr... *arr 80 100... 10 2 10... arr+i == &arr[i] *(arr+i) <==> arr[i] (long)(arr+1)==104 //!= 101 char chararr [6] = " Hello "; (long)(chararr+1) - (long)(chararr+2) == 1 == sizeof(char) (long)(arr+1) - (long)(arr+2) == 4 == sizeof(long) Слеводателно arr[i] <==> *(arr+i), независимо от размера на елементите Калин Георгиев Увод в програмирането 21 декември 2016 г. 13 / 23

Още за адресната аритметика arr... *arr 80 100... 10 2 10... arr+i == &arr[i] *(arr+i) <==> arr[i] (long)(arr+1)==104 //!= 101 char chararr [6] = " Hello "; (long)(chararr+1) - (long)(chararr+2) == 1 == sizeof(char) (long)(arr+1) - (long)(arr+2) == 4 == sizeof(long) Слеводателно arr[i] <==> *(arr+i), независимо от размера на елементите Калин Георгиев Увод в програмирането 21 декември 2016 г. 13 / 23

Масиви и функции long sum ( long arr []) long sum = 0; for ( int i = 0; i < 3; i ++) sum += arr [i]; return sum ; int main () int a [3] = 1,2,3; int b [4] = 10,2,3,4; cout << sum ( a) << " " << sum ( b) << endl ; Калин Георгиев Увод в програмирането 21 декември 2016 г. 14 / 23

Не можем да определим размера на масиви динамично long sum ( long arr [], int n) long sum = 0; for ( int i = 0; i < n; i ++) sum += arr [i]; return sum ; int main () int a [3] = 1,2,3; int b [4] = 1,2,3,4; cout << sum (a,3) << " " << sum (b,4) << endl ; Калин Георгиев Увод в програмирането 21 декември 2016 г. 15 / 23

"Подмасиви" c c+2... 1 2 3 4 5 6 7 8 9... int main () int c [8] = 1,2,3,4,6,7,8,9; cout << sum (c,4); cout << sum (c +2,4); Калин Георгиев Увод в програмирането 21 декември 2016 г. 16 / 23

Внимание! Странични ефекти! void test ( long arr [], long x) // void test ( long * arr, long x) x ++; arr [0]++; // <==> * arr =* arr +1 arr [1]++; // <== > *( arr +1)=*( arr +1)+1 int main () long arr [2]=0,1; long x = 0; test (arr,x); cout << arr [0]; cout << x; Калин Георгиев Увод в програмирането 21 декември 2016 г. 17 / 23

Пример: Двоично търсене Калин Георгиев Увод в програмирането 21 декември 2016 г. 18 / 23

Алгоритъм на двоичното търсене #0 left:0 right:6 a[3]<11 1 3 5 7 9 11 13 left:0 right:6 #1 left:4 right:6 a[5]==11 1 3 5 7 9 11 13 left:4 right:6 Калин Георгиев Увод в програмирането 21 декември 2016 г. 19 / 23

Реализация с цикъл bool find ( int x, int a[], int size ) int left =0, right = size -1; while ( left < right && a[( left + right )/2]!= x) if (a[( left + right )/2] < x) left = ( left + right )/2 + 1; else right = ( left + right )/2; return a[( left + right )/2] == x; 1 3 5 7 9 11 13 left:0 right:6 1 3 5 7 9 11 13 left:4 right:6 Калин Георгиев Увод в програмирането 21 декември 2016 г. 20 / 23

Реализация с рекурсия bool findrec ( int x, int a[], int size ) if ( size == 0) 1 3 5 7 9 11 13 return false ; left:0 if ( size == 1) return a [0] == x; 1 3 5 7 9 11 13 if (a[ size /2] > x) left:4 return findrec (x,a, size /2); if (a[ size /2] < x) return findrec (x,a+( int ) ceil ( size /2.0), ceil ( size /2.0) -1); return true ; right:6 right:6 Калин Георгиев Увод в програмирането 21 декември 2016 г. 21 / 23

А това защо работи? bool findreclogic ( int x, int a[], int size ) return ( size == 1 && a [0] == x) ( size > 1 && a[ size /2] > x && findreclogic (x,a, size /2)) 1 3 5 7 9 11 13 left:0 right:6 1 3 5 7 9 11 13 ( size > 1 && a[ size /2] < x && findreclogic (x, a+( int )ceil (size /2.0), ceil (size /2.0) -1)) left:4 right:6 ( size > 1 && a[ size /2] == x); Калин Георгиев Увод в програмирането 21 декември 2016 г. 22 / 23

Благодаря за вниманието! Калин Георгиев Увод в програмирането 21 декември 2016 г. 23 / 23