УКАЗАТЕЛИ. Переменная - это именованная область памяти с заданным типом. [=значение]; int a; //Переменная типа integer с именем a int b=2;// Переменная.

Презентация:



Advertisements
Похожие презентации
МАССИВЫ 4 Определение 4 Описание 4 Обращение к элементам массива 4 Связь массивов с указателями 4 Примеры программ.
Advertisements

Лекция 3. Одномерные массивы, указатели и ссылки Красс Александр СПбГУ ИТМО, 2008.
Функции Функция – именованная последовательность описаний и операторов, выполняющая некоторое действие. Может иметь параметры и возвращать значение. Функция.
©ρŧą Базовые конструкции языка.
Основы информатики Массивы. Указатели. Заикин Олег Сергеевич
Основы информатики Лекция. Массивы. Указатели. Заикин Олег Сергеевич
©Павловская Т.А. Язык С++ Курс «С++. Программирование на языке высокого уровня» Павловская Т.А.
Лабораторная работа 4. Подпрограммы. Задание на лабораторную работу Написать программу, реализующую хранение информации, указанной в вариантах индивидуальных.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
Лекция 5 Адресные типы. Указатели адрес (размещение в памяти) объекта Массивы последовательность однотипных данных Ссылки альтернативное имя объекта.
Элементы ЯПВУ. УКАЗАТЕЛИ. C / С++ Pascal Вся динамическая память в Pascal это сплошной массив байтов (куча). Адрес начала кучи храниться в переменной HeapOrg,
Двумерные динамические массивы. Двумерный массив - это одномерный массив, элементами которого являются одномерные массивы. Другими словами, это набор.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
Информационные технологии Классы памяти auto static extern register Автоматические переменные создаются при входе в функцию и уничтожаются при.
ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем УКАЗАТЕЛИ Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем.
Введение в C++ Урок 1-2.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Под объявлением одномерного динамического массива понимают объявление указателя на переменную заданного типа для того, чтобы данную переменную можно.
Лекция 6 Функции. Объявления и определения Объявление функции – указание имени функции, а также входных и выходных параметров Определение функции – указание.
Введение в язык программирования С++. Элементы языка общие с С. Полиморфизм. Инкапсуляция.
Транксрипт:

УКАЗАТЕЛИ

Переменная - это именованная область памяти с заданным типом. [=значение]; int a; //Переменная типа integer с именем a int b=2;// Переменная типа integer с именем b a=b+1;

Указатель - это такая же переменная, но хранящая адрес ячейки памяти ПК * [= адрес ]; int a = 1; // Переменная a содержит значение 1 int * b = &a;// Переменная b указывает на переменную a, т.е. содержит адрес переменной a.

& - взятие адреса * - возврат значения по указанному адресу int x=10; int *p, *g;//определение указателей p = &x;//берём адрес переменной xg = p;//создаём ещё один указатель который тоже указывает на x cout

y = &x; //присваивает адрес Х переменной Y Операцию & нельзя применять к константам и выражениям: &(7+x)& 28y=&A Операция * воспринимает свой операнд как адрес объекта и использует этот адрес для выборки содержимого: z = *y; // присваивает z значение переменной, записанной по адресу y (на которое указывает y) Если y = &x; z= *y; то z = x

Указатели могут встречаться в выражениях Пусть int *y; 1)* y=7; 2) * x * =5; 3) (* z)++* z++

int x = 1, y=0; int * ip; ip = & x; Если ip ссылается на x, то *ip можно использовать в любом месте, где допустимо применение x y=* ip;//y=? *ip +=1;// x=? (* ip)**;// x=?

Указатели и массивы Взаимосвязь между указателями и массивами. Любое действие, которое достигается индексированием массива, можно выполнить и с помощью указателей. Объявление int a[5]; определяет массив из 5-ти элементов: a[0], a[1], a[2], a[3], a[4] Имя массива a – это константа, которая содержит адрес его 1-ого элемента a[0]

int a[5]; int *pa; pa=& a[0]; pa указывает на a[0], т.е. pa содержит адрес элемента a[0]. pa+1 – указывает на следующий элемент; pa+i - указывает на i-ый элемент после pa; pa-i - указывает на i-ый элемент перед pa;

Если pa указывает на a[0],то *(pa+1) – содержимое a[1] *(pa+i) – содержимое a[i] Так как имя массива (без индекса) есть адрес его нулевого элемента, то можно записать: pa = a; Элемент a[i] можно представить *(a+i) После присваивания pa=& a[0]; pa и a имеют одно и тоже значение Присваивание pa=& a[0]; можно записать в видеpa = a;

Различие между именем массива и указателем: указатель – это переменная, имя массива – константа. pa=a;pa++; - допустимые операции a=pa;a++;-НЕ допустимые операции

Эквивалентные фрагменты программы: int a[5], b[5]4; int * pa; pa = b;/* или pa=&b[0]; */ /* Фрагмент 1 */ for (i=0; i

/* Фрагмент 3*/ for (i=0; i

Чтение указателей: справа налево, помнить о приоритетах! int * a;// a – указатель на int 1. int * * a0; 2. int * * const a; 3. int * const * z; 4. const int * p; 5. int * w[5]; 6. int (*w2)[5]; 7. int * const (*w3)[5];

©ρŧą16 int *(*p[10])(); изнутри наружу:.если справа от имени имеются квадратные скобки, это массив, если скобки круглые это функция;.если слева есть звездочка, это указатель на проинтерпретированную ранее конструкцию;.если справа встречается закрывающая круглая скобка, необходимо применить приведенные выше правила внутри скобок, а затем переходить наружу;.в последнюю очередь интерпретируется специфика- тор типа. Порядок интерпретации описаний массив из 10 указателей на функции без параметров, возвращающих указатели на int

Сложные типы данных int *Array[10]; int (*Array[10])(); int *Func(int);int **Ptr; int (*Array)[10]; int (*Func)(int);

Указатели и ссылки

Арифметика указателей int a = 0; int * b = &a; printf("%p\n",b); a++; b++; printf("%p\n",b); 0022FF74b = &a + sizeof(a); 0022FF78

Пример использования указателя на переменную целого типа #include void main() {int k=8; int *p; //p указывает в никуда p=&k; //p указывает на переменную k //Вывод переменной k двумя способами cout

Результат выполнения:

Если написать: p=cout

Пример на присваивание: #include void main() {int k=8; int *p1=&k, *p2; p2=p1; //Вывод переменной с помощью двух указателей cout

Пример на операцию ++: #include void main(){ int k[2]={-3, 4}; int *p=&k[0]; //Вывод 1го элемента массива и его адреса cout

Результат:

©ρŧą26 тип (*имя) ( список_типов_аргументов ); на объект на функцию на void Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции. Формат: int (*fun) (double, double); Указатели

©ρŧą27 содержит адрес области памяти, в которой хранятся данные определенного типа: тип *имя; int *a, b, *c; int i; const int ci = 1; int * pi; const int * pci; // ук.на целую константу int * const cp = &i; // ук.-константа const int * const cpc = &ci; Указатель на объект

©ρŧą28 1. Присваивание указателю адреса существующего объекта: с помощью операции получения адреса: int a = 5; int* p = &a; int* p (&a); с помощью значения другого инициализированного указателя: int* r = p; с помощью имени массива или функции: int b[10]; int* t = b; void f(int a ){ /*... */ } void (*pf)(int); pf = f; Инициализация указателей

©ρŧą29 2. Присваивание указателю адреса области памяти в явном виде: char* vp = (char *)0xB ; 3. Присваивание пустого значения: int* suxx = NULL; int* rulez = 0; 4. Выделение участка динамической памяти и присваивание ее адреса указателю: с помощью операции new : int* n = new int; int* m = new int (10); int* q = new int [10]; с помощью функции malloc : int* u = (int *)malloc(sizeof(int));

©ρŧą30 разадресация присваивание сложение с константой вычитание инкремент (++), декремент (– –) сравнение приведение типов При работе с указателями часто используется операция получения адреса (&). Операции с указателями

©ρŧą31 Операция разадресации char a;char * p = new char; *p = 'Ю'; a = *p; #include int main(){ unsigned long int A = 0Xсс77ffaa; unsigned int* pint = (unsigned int *) &A; unsigned char* pchar = (unsigned char *) &A; printf(" | %x | %x |", *pint, *pchar); } | ffaa | aa | | cc77 | ffaa |

©ρŧą32 Присваивание указателей Присваивание без явного приведения типов допускается в двух случаях: указателям типа void*; если тип указателей справа и слева от операции присваивания один и тот же. Приведение типов: (тип) выражение

©ρŧą33 - инкремент и декремент short * p = new short [5]; p++; long * q = new long [5]; q++; *p++ = 10; //*p = 10; p++; (*p)++; - сложение с константой - разность Арифметические операции с указателями

©ρŧą34 Унарная операция получения адреса & применима к величинам, имеющим имя и размещенным в оперативной памяти. Таким образом, нельзя получить адрес скалярного выражения, неименованной константы или регистровой переменной. int a = 5; int* p = &a; Операция получения адреса &

©ρŧą35 int kol; int& pal = kol; const char& CR = '\n'; Переменная-ссылка должна явно инициализироваться при ее описании, кроме случаев, когда она: является параметром функции описана как extern ссылается на поле данных класса После инициализации ссылке не может быть присвоена другая переменная. Тип ссылки должен совпадать с типом величины, на которую она ссылается. Не разрешается определять указатели на ссылки, создавать массивы ссылок и ссылки на ссылки. Ссылки тип & имя;

©ρŧą36 Массивы #include int main(){ const int n = 10; int marks[n] = {3, 4, 5, 4, 4}; int i, sum; for ( i = 0, sum = 0; i

©ρŧą37 float p[10]; *u[20]; int a[5] = {1, 2, 3}; int b[] = {1, 2, 3}; char cv[4] = { 'a', 's', 'd', 'f', 0 }; // error p[5]5[p]*(p+5)

©ρŧą38 delete [] p; free (q); float *p = new float [100]; float *q = (float *) malloc(100 * sizeof(float)); Динамические массивы

©ρŧą39 int matr [6][8]; Многомерные массивы matr[i][j] *(matr[i]+j) *(*(matr+i)+j) int mass2 [][2]={ {1, 1}, {0, 2}, {1, 0} }; int mass2 [3][2]={1, 1, 0, 2, 1, 0}; int x3d[3][5][7]; float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } }; // первый столбец, остальные 0

©ρŧą40 int nstr, nstb; cout > nstr >> nstb; int **a = new int *[nstr];// 1 for(int i = 0; i