Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций_2015.doc
Скачиваний:
40
Добавлен:
03.03.2016
Размер:
532.48 Кб
Скачать

10 Указатели и массивы

10.1 Указатели

int x;

int *px; /* объявляется указатель на данное целого типа */

px=&x; /* указателю px присвоили адрес переменной x */

ПАМЯТЬ-массив последовательно проадресованных ячеек, с кото- рыми можно работать по одному и группами.

Указатель-группа ячеек памяти (2 или 4 байта) , значениями которых является адрес.

Оператор & (унарный) выдаёт адрес объекта.

Пример 10.1:

p=&c;(р ссылается на переменную с)

pi=&i; (pi ссылается на переменную i)

Применяется только к операндам которые находятся в памятии (переменные и элементы массива)

Не могут быть применины к константам и выражениям

Унарный оператор * -оператор раскрытия ссылки,

применяется только к указателям. Результат - объект, на который ссылается указатель

Пример 10.2:

int a=1,b=2,z[5];

int *ip; /* объявляем указатель на переменную целого

типа */

ip=&a; /* указатель ip ссылается на переменную a */

b=*ip; /* b=1 */

*ip=0; /* a=0 */

ip=&z[2] /* ip указывает на z[2] */

Указатель ссылается только на объекты заданного типа (кроме void)

При объявлении указателя можно написать указатель на тип void:

void *p;

но потом применять оператор разоименования (*) нельзя

Пусть

int a=1;

int *ip; => Используем *ip везде, где допустимо использовать a:

ip=&a;

- *ip=*ip+10; /* a+=10 */

- y=*ip+1; /* y=11+1 */

- *ip+=1; /* 11+1=12 */

|||

- +*ip; /* 12+1=13 */

- (*ip)++; /* 13+1=14 */

- ! *ip++; /* изменяется сам указатель, а не то

значение на которое он ссылается */

В этом примере увелечение самого указателя на 1 приводит к тому,что ссылается на следующий элемент того типа, какой был

заявлен в деклорации.

Указатель есть переменная, а поэтому он может встречатся в программе и без оператора *

Пример10.3:

int a;

int *ip,*ir;

ir=&a;

ir=ip;

    1. Связь между указателями и массивом

В языке C связь между указателями и массивом очень тесная, так как любая операция взятия элемента массива может быть выполнена с помощью оператора *(!!! более того * выполняется быстрее)

[ ]  *

int a[5];

i-й элемент:a[i]

С указателем:

int *pa

pa=&a[0];

x=*pa =>x=a[0];

Адресная арифметика:

Если указатель pa указывает на некоторый элемент массива, то выражение pa+1 указывает на следующий элемент массива, pa+i – на i-й после pa, pa-1 – на предыдущий (перед pa).

Если pa=&a[0], то *(pa+1)~a[1]

pa+i~ адрес a[i]

*(pa+i)~a[i]

Пример 10.4:

int *pa;

int a[5]= -1,-10,-100,-1000,-10000 ;

int a1,a2;

pa=&a[0];

a1=*(pa+1); /* a1=-10 */

a2=*(pa+2); /* a2=-100 */

Связь между адресной арифметикой и индексированием массива

Значение переменой или выражения типа массива есть адрес нулевого элемента этого массива.

ПРИМЕР 10-5

int a[5], *pa, *pm

pa=&a[0]:pm=a;

Эквивалентны

a[i] | *(a+1)

&a[i] | a+i

pa[i] *(pa+i)

Указатели группируються обычные элементы.Указатели также можно индексировать.Тогда *(pa+i) pa[i].Различия между именем.

I 10-4 Различия между именем масства и указателем(в роли имени массива)

Указатель=переменная

-допустимо

int*pa; int a[5]

pa=a;

pa++;

-недопустимо

int*pa;

int a[5];

a=pa;

a++;