Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Proga (pechat).docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
90.29 Кб
Скачать

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

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

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).

Сравнение указателей имеет смысл только когда они относятся к одному и тому же массиву.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]