|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Взаимосвязь массивов и указателей. Описание указателяВ отличии от массива ссылок, массив указателей является допустимым: int &jar[]={ix, jx, kx}; // приводит к ошибке int *iar[]={&ix, &jx, &kx}; // правильно Имя массива по умолчанию считается указателем на первый элемент массива. int arr[10]; arr ↔ & arr [ 0 ] arr [ i ] ↔ & (arr +i) адрес i-го эл-та int members = sizeof(arr) / sizeof(int); //=10 или на размер любого из эл-ов int a1[100], b1[100]; int * pa=a1; //& a1 [0] int * pb=b1; //& b1 [0] for (i=0; i<100; i++) {* pb ++ = * pa ++;} Для многомерного массива, его имя является указателем-константой на массив указателей-констант, эл-ты которого содержат адрес начала каждой из строк этого массива: int arr1[10] [10]; arr1[0] ↔ & arr[0] [0], т.е. эквивалентно адресу на строку arr1[1] ↔ & arr[1] [0] Способы обращения к массиву: float T[5][5]; 1) T[ i ][ j ] 2) * (T[ i ] + j) 3) * (*(T+i) + j) Способ доступа к переменной: по имени, через механизм указателей. Указатель-константа – это значения адреса оперативной памяти, которое изменить нельзя. Указатель-переменная (=просто указатель) – это переменная для хранения адреса памяти, обычно другой переменной/ объекта. Описание: <имя> * <имя_перем.> [=<нач_зн.>]; int * p_int; long * p1; float t; float * ptr = &t; 31. Арифметические действия с указателями, зависимость результата от типа указателя. Число байтов участвующих в любой операции с указателем (извлечение из памяти или размещение в памяти) определяется компилятором исходя из того типа данных, на которых указатель ссылается. Для: void * ppp; Обязательно: (char *) ppp; Операция разиминования не может применятся к константе так как она не имеет доступного адреса в памяти. Существуют ограничение на использованье операции ссылка: 1) нельзя определить адрес константы //int p1 = & 0xff00; - error 2)нельзя определить адресс значения вычисления как результат арифметического выражения. Int var1 = 3, * ptr; // ptr= & (var1 * 5); - error 3)Нельзя получить адрес переменной описанной как register Unsigned int register r1; Сама переменная-указатель тоже имеет адрес, поэтому будет корректным выражение: int a, *ptr 1, *ptr2 = & a; ptr1 = (int *) & ptr2; Указатель типа void * часто называют родовым (generic), он не отражать информацию о размере объекта в памяти и может использоваться в таком выражении: unsigned long block = 0xffeeddcc; void * p = & block; char ch; unsigned <int> two_bytes; long int four_bytes; ch=*(char*)p; // ch=0xcc; two_bytes= *(unsigned*)p; // two_bytes=0xddxx four_bytes=*(long int *) p; // four_bytes=0xffeeddcc; Для указателей-переменных допустимы следующие операции: - присваиванье - инкремент / декремент - сложение/ вычитание - сравнение Арифметические операции с указателем выполняются по специальным правилам: type * ptr + [-] N то значение указ-я изменяется на N*sizeof (type) (N - константа) Разность двух указателей – это разность их значений, делённая на sizeof (type). Сравнение указателей имеет смысл только когда они относятся к одному и тому же массиву. 32. Указатель типа void*. Преобразование указателя операцией приведения типа. Указатель типа void (часто называют родовым (generic)) может не отражать информацию о размере объекта в памяти и может использоваться в таком варианте как: unsigned long block = 0xffeeddcc; void*p=█ char ch; unsigned two_bytes; long int float_bytes; ch=*(char*)p: // ch=0xcc; two_bytes= *(unsigned*)p; // two_bytes=0xddxx four_bytes=*9long int*)p; // four_bytes=0xffeeddcc; 33. Доступ к переменным через указатели: операция & и операция *. int main() Примечание: 34. Массивы указателей. Указатель на указатель. · int data = 5; · int *ptr = &data; · int **ptr_ptr = &ptr; · int ***ptr_ptr_ptr = &ptr_ptr; Элементы массива указателей могут иметь любой тип, в том числе и тип указатель: 35. Арифметические действия с указателями. 36. Структура модуля С++. Заголовочные файлы (назначение, подключение). Использование стандартных и собственных файлов.h-файлов. Программа на языке С++ (это текстовый файл с расширением «.cрр») имеет такой общий вид: 1. # директивы include 2. объявления базовых классов 3. объявления производных классов 4. прототипы обычных функций 5. функция main 6. определения обычных ф-ций В большинстве крупных проектов все объявления должны размещаться в отдельном заголовочном файле, который может включаться в каждый модуль. Однако общая структура программы остается неизменной. В заголовочных файлах обычно объявляют функции стандартной библиотеки (Си и С++). Заголовочный файл, или подключаемый файл —файл, механически «вставляемый» компилятором в исходный текст в том месте, где располагается некоторая директива (#include <file.h> в Си). Директива #include позволяет добавлять в программу ранее написанные программы сохраненные в виде файлов. Есть две разновидности директивы #include: o #include <cstdlib> (с++) / #include < stdio.h > (си) - имя файла в угловых кобках, скобки сообщают препроцессору о том, что необходимо искать файл (в данном случае stdio.h) в одном или нескольких стандартных системных каталогах. o #include «mylib.h» - имя файла в кавычках, свидетельствуют о том, что препроцессору необходимо сначала выполнить поиск файла в текущем каталоге, т.е. в том, где находится файл создаваемой программы, а уже затем – искать в стандартных каталогах. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |