АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Взаимосвязь массивов и указателей. Описание указателя

Читайте также:
  1. B. ОБЩЕЕ МЕДИЦИНСКОЕ ОБОРУДОВАНИЕ (игровое описание)
  2. III. Описание проекта
  3. IV. ОПИСАНИЕ МАРШРУТА
  4. IV. Описание ценностных ориентиров содержания учебного предмета
  5. VI.1. Описание потребителей
  6. А) Описание области профессиональной деятельности учителя литературы.
  7. Алгебраическое описание метода
  8. Анализ объекта проектирования. Описание компонента РЭС
  9. Взаимосвязь и взаимовлияние организации управления предприятием и информационной системы
  10. Взаимосвязь и отличительные особенности управленческого и бухгалтерского учета.
  11. Взаимосвязь и противоречие основных принципов налоговой системы
  12. Взаимосвязь инвестиций и сбережений в классической и кейнсианской концепциях.

В отличии от массива ссылок, массив указателей является допустимым:

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; & 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=&block;

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()
{
int a;
int b;
int *ptr=&a;
b=*ptr;
}
В этом примере мы получили доступ к переменной через указатель ptr.
В данном примере: & - операция «ссылка», которая означает взять адрес объекта перед которым стоит оператор.
* - операция разыменование, которая означает взять значение, которое совпадает с данным адресом.

Примечание:
Операция * не может применятся к указателям типа void.
int p1=&0xff00 нельзя брать адрес в таких случаях
Нельзя определить адрес как результат арифметического выражения.
Нельзя получить адрес переменной описаной как register.

34. Массивы указателей. Указатель на указатель.
int *mas_ptr[10];
Имя массива mas_prt – указатель на первый элемент этого массива. То есть, указатель на массив – это указатель на указатель.
Количество символов «*» после типа определяет число уровней указателя:

· int data = 5;

· int *ptr = &data;

· int **ptr_ptr = &ptr;

· int ***ptr_ptr_ptr = &ptr_ptr;

Элементы массива указателей могут иметь любой тип, в том числе и тип указатель:
char *message[]={“Не найден файл”,”Переполнение”,”Модуль не найден, но в нем все равно произошла ошибка.”};
char *months[12]={“Jan”,”Feb”,”Mar”,…,”Dec”};
Вывод по строкам:
char **ptr_ptr=message;//Или &message.
while (*ptr_ptr)
puts(*ptr_ptr++);
puts(“\n”);
Посимвольный вывод:
while(*ptr_ptr)
{while(**ptr_ptr)
{putchar(**ptr_ptr);
(*ptr_ptr++); }
ptr_ptr++;
puts(“\n”);}

35. Арифметические действия с указателями.
Для указателей переменных допустимы следующие операции:
1) Присваивание
2) Инкремент, декремент
3) Сложение, вычитание
4) Сравнение
Арифметические операции с указателями выполняются по специальным правилам. Если type *ptr + (-) N, то значение *ptr увеличится (уменьшится) на N*sizeof(type). Аналогично для инкремента и декремента.
Сравнение указателей имеет смысл, когда они относятся к одному и тому же массиву.

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» - имя файла в кавычках, свидетельствуют о том, что препроцессору необходимо сначала выполнить поиск файла в текущем каталоге, т.е. в том, где находится файл создаваемой программы, а уже затем – искать в стандартных каталогах.


1 | 2 | 3 | 4 | 5 | 6 | 7 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)