Указатель - это адрес памяти, распределяемой для размещения идентификатора (в качестве идентификатора может выступать имя переменной, массива, структуры, строкового литерала).Если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находиться величина любого типа. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя: Имя_типа * имя_указателя; Имя_типа задает тип объекта и может быть любого основного типа. Пример: char *z; int *k, *i; float *f; *z обозначает объкт типа char, на который указывает z. Оператор *z=’ ‘; засылает символ «пробел» в тот участое памяти, адрес которого определяет указатель z. С помощью операции обращения по адресу можно записывать значения: *xptr = 10; // записать число 10 по адресу xptr. После выполнения этого оператора значение переменной x станет равным 10, поскольку xptr указывает на переменную x. Для вывода значений указателей в форматной строке printf() используется спецификатор %p. Две переменные типа указатель нельзя суммировать, однако к указателю можно прибавить целую величину. Правила прибавления здесь такие же, как и в предыдущей операции. Так, после команды xptr+=3; (xptr типа int) значение указателя изменилось с FFF2 на FFFE. В отличие от операции сложения, операция вычитания применима не только к указателю и целой величине, но и к двум указателям одного типа. Разность указателей показывает, сколько объектов соответствующего типа может поместиться между указанными адресами. В языке С определена символическая константа NULL для обозначения нулевого значения указателя. Между указателями и массивами существует определенная связь. Предположим, имеется массив из 100 целых чисел. Запишем двумя способами программу суммирования элементов этого массива:
1. long array[100]; long sum = 0; for (int i = 0; i < 100; i++) sum += array[i];
2. long array[100]; long sum = 0; for (long* ptr = &array[0]; ptr < &array[99] + 1; ptr++) sum += *ptr;
Упоминание имени массива без индексов преобразуется в адрес его первого элемента. for (long* ptr = array; ptr < &array[99] + 1; ptr++) sum += *ptr; С помощью указателя в вызываемую функцию можно передать адрес любого объекта из вызывающей программы. Не меняя самого параметра функции (адрес) можно изменить содержимое ячейки по данному адресу. #include #include void main() { void positive(int *m); int k=-3; positive(&k); printf("\n k=%d",k); getch(); } void positive(int *m) { if (*m < 0) *m=-*m; } Если в качестве параметра функции используется обозначение массива, то на самом деле внутрь функции передаётся только адрес начала массива, а значит внутри функции можно изменять значения элементов такого массива. Если мы используем массив b в качестве параметра функции, то следующие конструкции идентичны: float b[]; и float *b; Пример. Рассмотрим функцию, возводящую в квадрат значения элементов одномерного массива. #include #include void quart(int x[], int n);
void main() { int z[]={1,2,3,4}; int j; quart (z, 4); for (j=0;j < 4; j++) printf("\n %d",z[j]); getch(); } void quart(int x[],int n) { int i; for (i=0; i < n; i++) x[i]*=x[i]; } Заголовок функции может быть следующим: void quart(int *x, int n); А обращение к элементам массива внутри функции - *(x+i). Двумерный масив размерности можно представить как одномерный масив одномерных масивов. Выражение a[i][j] переводится компилятором в эквивалентное выражение *(*(a+i)+j). Варіанти індивідуальних завдань:
|