Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций по курсу 'Информатика'.doc
Скачиваний:
4
Добавлен:
14.07.2019
Размер:
483.84 Кб
Скачать

Адреса и указатели.

Главным объектом нашей работы на этом этапе является переменная. Перед работой с ней определяем ее имя и тип, можем сразу и проинициализировать ее, т. е. задать ей начальное значение. Все это выполняет оператор описания:

int m=10 ;

Каждая переменная имеет еще одну важную характеристику – адрес в памяти, его устанавливает транслятор, выделяя свободную ячейку. Язык С позволяет работать с адресами, именами и значениями любых объектов, в частности переменных.

По имени переменной можно извлечь адрес, используя операцию адресации:

&m – адрес переменной m, целочисленная константа без знака. Символическое изображение этого адреса &m - является константой типа указатель. Опишем переменную типа указатель:

int *pm , k ; // описание типа переменной pm означает, если взять значение расположенное по

// этому адресу, то оно будет целым. Осуществляет эту операцию *pm.

pm=&m ; // адрес целой переменной m присваивается переменной типа указатель pm.

k=*pm ; // извлекается значение, лежащее по адресу помещенному в pm и присваивается

// переменной k. Переменные m и k имеют одно и тоже значение.

Мы уже встречались с адресацией в операторе:

scanf (“%d” , &a) ;

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

Еще раз сформулируем операции получения адреса и значения.

& - операция получения адреса, если за этим знаком следует имя переменной.

* - операция косвенной адресации ( обратная к извлечению адреса ), когда за этим знаком следует

указатель на переменную. Результатом является значение, извлеченное по данному адресу.

Распечатать адрес можно как целую переменную без знака, используя спецификацию %u.

printf (“%u” , pm) ; или так printf (“%u” , &m) ;

Массивы.

Массив – набор перенумерованных переменных одного типа, обозначенных одним именем.

Еще одно более сложное определение:

Массив - именованная структура данных прямого доступа.

Прямой доступ означает, что по указанному номеру можно извлечь сразу любой элемент.

Одномерный массив – вектор. Двумерный – матрица.

Описание массива:

Int a[10] ; // целочисленный вектор из 10 элементов.

float b[5][7] ; // вещественная матрица из 5 строк и 7 столбцов.

В памяти любые массивы располагаются последовательно и непрерывно. Матрицы располагаются цепочкой по строкам.

Существуют массивы и большей размерности 3-х, 4-х мерные, но используются они очень редко.

Представить себе такой массив легко, как набор перенумерованных книг. Укажем номер книги, страницы, строки и столбца, получим нужную информацию.

Работают с массивом, указывая его элементы – a[5] b[0][3].

Имя массива определяет адрес его нулевого элемента:

a одно и тоже с &a[0]

a+5 одно и тоже с &a[5]

*(a+5) одно и тоже с a[5].

Векторы.

Поработаем сначала с одномерными массивами.

Вектор можно проинициализировать:

int x[10]={ 1, 4, -6, 8, -1, 0, 0, 32, 100, -1} ;

Mожно описать и ввести с экрана:

int x[10] , i ;

for (i=0 ; i<10 ; i++)

scanf(“%d” , &x[i]) ;

Очень полезна эхо-печать:

for (i=0 ; i<10 ; i++)

printf(“%d ” , x[i]) ;

Обратите внимание, что отсчет элементов в любом массиве идет с 0, а не с 1. В нашем векторе 10 элементов, но первый – x[0], а последний –x[9].

Рассмотрим задачу: вычислить 10 чисел Фибоначчи.

, , .

int a[10] , i ;

a[0]=1 ; a[1]=1;

for (i=0 ; i<=7 ; i++)

a[i+2]= a[i]+a[i+1];

for (i=0 ; i<=9 ; i++)

printf(“%d ” , a[i]) ;

Еще одна задача: найти в векторе нулевой элемент, удалить его и придвинуть «хвост».

int dan[10]={5, 4, 7, -1, 0, 9, 4, -10, 9, 2} ;

int i=0 , k ;

while (dan[i]!=0) i++ ;

for ( k=i ; k<9 ; k++)

dan[k]=dan[k+1] ;

for ( k=0 ; k<=9 ; k++)

printf(“%d ” , dan[k]) ;

Вопросы: 1) Какая возникнет ошибка при «плохих» исходных данных – в векторе нет нуля?

2) Как изменится программа, если нужно задвинуть все имеющиеся нули?