Лекция 1. Основы алгоритмизации и программирования на Си (1153708), страница 7
Текст из файла (страница 7)
Для "малых" моделей памяти (tiny, small) адресация осуществляется в пределах одного сегмента памяти, и указатель занимает двабайта, для "больших" моделей памяти (large, huge) указатели занимают четыре байта.Кроме операции *, к указателям применимы операции сравнения(<, <=, >, >=, ==, !=), присваивания, арифметические операции сложения, вычитания, инкремента и декремента. Справа от операцииприсваивания должен стоять указатель того же типа, что и слева (отоперации присваивания), или указатель NULL. Сравнивать можно указатели одного типа (или указатель произвольного типа с NULL).Нельзя суммировать (вычитать) указатели, можно только прибавлять к ним (вычитать из них) целую величину.
При этом результатоперации зависит не только от значения операндов, но и от типа, с которым связан указатель. Если объявление указателя р имеет вид тип*р, то в результате оператора р=р+k, где k - некоторое целое значение, р увеличится на k*sizeof (тип).Пример. int *p; long int pp;...p++;/*p увеличилось на 2*/pp++;/*pp увеличилось на 4*/1.5.5. Связь массивов с указателями в СиОдномерные массивыИмя одномерного массива является указателем-константой,равной адресу начала массива, т. е.
адресу элемента с индексом 0(первого элемента).Рассмотрим объявление некоторого одномерного массива, дляопределенности int a[10]; тогда обозначение &a[0] эквивалентно a,a[0] эквивалентно *a, &a[i] эквивалентно a+i (i=0,1,...9), a[i] эквивалентно *(a+i).Двумерные массивыИмя двумерного массива является указателем-константой наначало (элемент с индексом 0) массива указателей-констант, i-й40элемент этого массива - указатель -константа на начало (элемент синдексом 0) i-й строки двумерного массива.Так, например, с массивом int b[5][8] связан массив указателейконстант b[0], b[1],...,b[4]; b[ i ] - указатель на начало i-й строки, т.
е.на элемент b[ i ][0], i=0,1,...,4; вышесказанное поясняется схемой:bb[0]b[0][0] b[0][1] . . .b[0][7]b[1]b[1][0] b[1][1] . . .b[1][7]b[2]b[2][0] b[2][1] . . .b[2][7]b[3]b[3][0] b[3][1] . . .b[3][7]b[4]b[4][0] b[4][1] . . .b[4][7]Элемент массива b[i][j] можно также обозначить *(b[i]+j) или*(*(b+i)+j); это все равноправные обозначения. &b[i][j], b[i]+j, *(b+i)+j также равноправные обозначения адреса элемента массива b[i][j].Для любого из трех обозначений элемента двумерного массивапрограмма в кодах получается практически одинаковой по производительности, хотя при использовании арифметики указателей вместоквадратных скобок несколько более короткой [3]. Хороший стиль программирования предполагает употребление в пределах одной программы одного (из трех) обозначений.41.