Главная страница

Лекции. Основные понятия и определения


Скачать 1.94 Mb.
НазваниеОсновные понятия и определения
Дата27.03.2018
Размер1.94 Mb.
Формат файлаdocx
Имя файлаЛекции.docx
ТипКонтрольные вопросы
#39570
страница42 из 58
1   ...   38   39   40   41   42   43   44   45   ...   58

Вопросы для самопроверки и контроля

Вопросы для самопроверки

1. Могут ли исполняемые инструкции записываться вне тела процедур?

2. Может ли в одной области видимости исполняемая инструкция предшествовать декларации?

3. Отличается ли время жизни для объектов static и extern?

4. Объявление объекта с ключевым словом extern это определение или описание?

5. Что произойдет, если число инициаторов будет больше числа элементов массива?
Контрольные вопросы

1. В чем отличие применения ключевого слова static в языках C и Basic?

2. Укажите различия в действии инструкции Public и атрибута extern?

3. Чем инициируются определяемые объекты в языке Basic?

4. Что определяет инструкция Private?

5.Что понимают под проектом приложения?

15. УКАЗАТЕЛИ, МАССИВЫ, СТРОКИ


Материал этого раздела посвящен указателям, связи указателей с массивами, выделению памяти по указанию программиста (так называемым динамическим объектам) и строкам. Следовательно, большая его часть относится к языку C, поскольку в языке Basic нет понятия указателя. Приемы работы со строками включены в этот раздел в связи с тем, что в языке C нет такого типа данных и все манипуляции со строковыми данными осуществляются с помощью библиотечных функций, большинство из которых в качестве аргументов и возвращаемого значения используют данные типа char * (указатель на тип char). Представляется логичным рассмотреть в соответствующем подразделе средства манипулирования со строками языка Basic, которые будут специально выделены.

15.1. Указатели


Указатель – это переменная, содержащая адрес некоторого объекта программы, причем определенного типа, в том числе и типа пользователя. Следовательно, указатель содержит не только адрес, но и информацию о длине объекта данного типа.

Определение указателей


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

Пример.

char *s, *x;

double *t, *p;

complex *y; // Тип данных пользователя

Задание значений


Задать значение указателю можно следующими способами:

  • p=&l; // Задание адреса объекта программы

  • t=p; // Присваивание значения другого указателя

  • p=NULL;// Символическая константа NULL, определенная в

//файле stdio.h, используется для задания значения,

// не указывающего ни на 1 объект программы

  • scanf("%p",&q); // Ввод c клавиатуры. Спецификация p

  • pt=(double*)0777000; // Ссылка на фиксированный адрес

Последние 2 способа используются редко.

Вывод значений


Используется редко.

Пример.

printf("Адрес структуры=%p\n",ptr); // Адрес структуры=FF00

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


Между указателями и массивами существует тесная связь. Любое действие, выполняемое индексированием массива, может быть реализовано с помощью указателей, причем последний вариант более быстр и объектный код более компактен, однако такая реализация требует навыка и воспринимается хуже.

Если имеется определение вида short a[10], то упоминание имени a в программе означает ссылку (адрес) на элемент массива a[0], т.е. на начальный адрес массива. Пусть имеем определение short *pa; тогда запись pa=&a[0] эквивалентна записи pa=a.

С указателями можно выполнять арифметические действия, лишь бы они имели смысл.

Пример.

short a[10], *pa;

pa=a;

Выражение pa+5 определяет адрес 5-го элемента массива a, т.е. это выражение задает смещение в 10 байтов от начала массива; выражение pa+i - адрес i-го элемента массива a. Отсюда следует, что запись *(pa+i) эквивалентна записи *(a+i), а она эквивалентна в свою очередь записи a[ i ]. Аналогично b[ i ][ j ] эквивалентно *(*(b+i)+ j).

Вывод. Любое обращение к элементу массива можно записать как ссылку и смещение относительно начального адреса массива.

Между использованием массивов и указателей есть следующие отличия:

- определение массива вызывает выделение памяти под все элементы массива, а определение указателя – выделение памяти только под него;

- имя массива является указателем – константой, т.е. его значение изменить нельзя, а значение указателя можно.

Пример. Сортировка массива с помощью индексирования и указателей.


void sort(short n, double zap[ ]){

double buf;

short i, j, min_ind;
for(i=0; i

buf=zap[ i ];

min_ind=i;

for(j=i+1; j

if(buf>zap[ j ]){

buf=zap[ j ];

min_ind=j;

}

}

void sort(short n, double *zap){

double buf;

short i, j, min_ind;
for(i=0; i

buf=*(zap + i);

min_ind=i;

for(j=i+1; j

if(buf>*(zap + j)){

buf=*(zap + j);

min_ind=j;

}

}

zap[min_ind]=zap[ i ];

zap[ i ]=buf;

}

} // End sort
*(zap + min_ind)=*(zap + i);

*(zap + i)=buf;

}

} // End sort


Для многомерных массивов запись x[ i ] означает адрес i-го подмассива (сечения). При n=2 запись x[ i ] эквивалентна записи &x[i][0].

Пример применения.

double x[10][10];

................

sort(10, x[ i ]); // Обращение к функции сортировки элементов i-й строки
1   ...   38   39   40   41   42   43   44   45   ...   58


написать администратору сайта