Указатели, массивы, строки, функции. Решение задачи. Работа с отладчиком, страница 2

Работа с переменными через указатели.  Обращение к переменной можно произвести либо по  имени переменной либо по адресу по которому хранится переменная, т.е. через указатель.

Возможно создание универсального указателя.  Такой указатель создается как указатель на пустой (неопределенный) тип. Такой переменной можно присвоить значение любого указателя. Но вот для извлечения значения необходимо указать компилятору, переменная какого типа хранится по этому адресу. Поэтому используется операция приведения типа.

7)  программа  Dc_6.c

Программа показывает сколько места в памяти отводит компилятор под переменные или под определенный тип. Для этого используется операция sizeof – размер в байтах

sizeof(переменная)

sizeof(тип)

Выделяемое место зависит от компилятора и отражает идеалогию «машинного слова».

Так, целое для 16-разрядной машины имеет размер 16 бит  = 2 байт, а для 32-разрядной машины имеет размер 32 бит  = 4 байт. Такой же размер задается и для хранения указателя.

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

8)  программа  Dc_7.c(основой курс)

int A[10];    -  так вводится массив из 10 целых.

Можно ввести массив и сразу его инициализировать:

int A[10] = {0,1,2,3,4,5,6,7,8,9};        - некий аналог инструкции DATA Фортрана.

Здесь подчеркнуто то, что элементы массива индексируются начиная с 0, т.е.

A[0] = 0

A[1] = 1

И элемент массива с самым большим индексом = 10 –1 = 9

A[9] = 9

Арифметика указателей.

Пусть Указатель показывает на ячейку памяти, в которой хранится переменная ОПРЕДЕЛЕННОГО типа.  Попробуем  поменять значение указателя. На какое минимальное значение можно сдвинуть указатель? Мы не можем сдвинуть указатель на 1 бит, потому что после такого сдвига мы окажемся внутри данных, лежащих в ячейке памяти. Так на сколько бит можно сдвинуть указатель?

Ровно на столько, чтобы не «поломались» данные в текущей ячеке памяти. Т.е. надо свинуться в адресном пространстве на величину размера ТИПА данного.

При таком сдвиге такой указатель не сможет показать куда-то внутрь  переменной. Поэтому для указателей естественно реализовать переходы к следущему и предыдущему значению такого же типа. Это обозначают прибавлением (вычитанием) 1 к указателю. Это означает не сложение адреса с 1, а переход к следующему адресу такого же типа, т.е. переход к соседу.

Аналогично, прибавление, например, 6 означает не сложение адреса с 6, а переход к 6 соседу вперед.

Принято, что имя массива задает адрес начала массива (так передавались функциям массивы в Фортране). Поэтому к соседним ячейкам массива можно адресоваться либо по их индексам, как в Фортране, либо через указатель на начало массива и переход к нужному соседу.

Поменяйте тип переменных с int  на short int ( или long), так чтобы изменился размер типа int. Посмотрите, что обращение к соседям останется правильно работать.

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

9)  программа  Dc_8.c

Работа со строками в Си.

-  В Фортране мы имели дело с «равноправными» независимыми компонентами – главной программой и внешними подпрограммами (функциями). В Си это называется – “эти программные компоненты определены на ГЛОБАЛЬНОМ уровне”. На этом же глобальном уровне  можно определить и  Переменные.   Переменные объявленные вне функции main( ) – глобальные переменные . Такие переменные доступны всем функциям. (Некий аналог неименованного COMMON блока Фортрана).