Лекции. Основные понятия и определения
![]()
|
Вопросы для самопроверки и контроляВопросы для самопроверки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; // Тип данных пользователя Задание значенийЗадать значение указателю можно следующими способами:
//файле stdio.h, используется для задания значения, // не указывающего ни на 1 объект программы
Последние 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 |