- •1.Основные компоненты программного обеспечения и их связь с аппаратурой. Ретроспектива развития программирования.
- •2 Этапы решения задач на эвм
- •3 Основные типы данных и структуры данных в программировании
- •3.1.1 Арифметические типы
- •3.1.2 Логический тип
- •3.1.3 Символьный тип
- •4 Методы решения задач программирования
- •5 Разработка алгоритмов Пример 5.8
- •Пример 5.9
- •Пример 5.10
- •6 Кодирование алгоритмов на языке си
- •- Семантические;
- •Тело директивы
- •Имя аргумента
- •Оператор
- •6.4.1 Имена переменных Имена переменных могут состоять из букв (только из латинского алфавита), цифр и символа подчеркивания, приравненного к букве. Начинаться имя должно с буквы.
- •Пример 6.3:
- •6.4.2 Типы и размеры данных
- •6.4.3 Константы
- •Пример 6.4:
- •Пример 6.5:
- •Пример 6.6:
- •Пример 6.7:
- •Пример 6.8:
- •7 Декларации в си
- •8 Операторы в языке си
- •9 Управление в си
- •10 Указатели и массивы
- •Литерные указатели
- •11 Структуры в языке си
- •Структуры, вложенные друг в друга
- •Пример 11.10
- •12 Функции и структура программы
- •Аппарат формальних і фактичних аргументів Приклад 12.4
- •Опис прототипу функції
- •Приклад 12.5
- •13 Передача аргументов
10 Указатели и массивы
10.1 Указатели
int x;
int *px; /* объявляется указатель на данное целого типа */
px=&x; /* указателю px присвоили адрес переменной x */
ПАМЯТЬ-массив последовательно проадресованных ячеек, с кото- рыми можно работать по одному и группами.
Указатель-группа ячеек памяти (2 или 4 байта) , значениями которых является адрес.
Оператор & (унарный) выдаёт адрес объекта.
Пример 10.1:
p=&c;(р ссылается на переменную с)
pi=&i; (pi ссылается на переменную i)
Применяется только к операндам которые находятся в памятии (переменные и элементы массива)
Не могут быть применины к константам и выражениям
Унарный оператор * -оператор раскрытия ссылки,
применяется только к указателям. Результат - объект, на который ссылается указатель
Пример 10.2:
int a=1,b=2,z[5];
int *ip; /* объявляем указатель на переменную целого
типа */
ip=&a; /* указатель ip ссылается на переменную a */
b=*ip; /* b=1 */
*ip=0; /* a=0 */
ip=&z[2] /* ip указывает на z[2] */
Указатель ссылается только на объекты заданного типа (кроме void)
При объявлении указателя можно написать указатель на тип void:
void *p;
но потом применять оператор разоименования (*) нельзя
П
усть
int a=1;
int *ip; => Используем *ip везде, где допустимо использовать a:
ip=&a;
- *ip=*ip+10; /* a+=10 */
- y=*ip+1; /* y=11+1 */
- *ip+=1; /* 11+1=12 */
|||
- +*ip; /* 12+1=13 */
- (*ip)++; /* 13+1=14 */
- ! *ip++; /* изменяется сам указатель, а не то
значение на которое он ссылается */
В этом примере увелечение самого указателя на 1 приводит к тому,что ссылается на следующий элемент того типа, какой был
заявлен в деклорации.
Указатель есть переменная, а поэтому он может встречатся в программе и без оператора *
Пример10.3:
int a;
int *ip,*ir;
ir=&a;
ir=ip;
Связь между указателями и массивом
В языке C связь между указателями и массивом очень тесная, так как любая операция взятия элемента массива может быть выполнена с помощью оператора *(!!! более того * выполняется быстрее)
[ ] *
int a[5];
i-й элемент:a[i]
С указателем:
int *pa
pa=&a[0];
x=*pa =>x=a[0];
Адресная арифметика:
Если указатель pa указывает на некоторый элемент массива, то выражение pa+1 указывает на следующий элемент массива, pa+i – на i-й после pa, pa-1 – на предыдущий (перед pa).
Если pa=&a[0], то *(pa+1)~a[1]
pa+i~ адрес a[i]
*(pa+i)~a[i]
Пример 10.4:

int
*pa;
int a[5]= -1,-10,-100,-1000,-10000 ;
int a1,a2;
pa=&a[0];
a1=*(pa+1); /* a1=-10 */
a2=*(pa+2); /* a2=-100 */
Связь между адресной арифметикой и индексированием массива
Значение переменой или выражения типа массива есть адрес нулевого элемента этого массива.
ПРИМЕР 10-5
int a[5], *pa, *pm
pa=&a[0]:pm=a;
Эквивалентны
a[i] | *(a+1)
&a[i] | a+i
pa[i] *(pa+i)
Указатели группируються обычные элементы.Указатели также можно индексировать.Тогда *(pa+i) pa[i].Различия между именем.
I 10-4 Различия между именем масства и указателем(в роли имени массива)
Указатель=переменная
-допустимо
int*pa; int a[5]
pa=a;
pa++;
-недопустимо
int*pa;
int a[5];
a=pa;
a++;
