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

1.Операции с адресами

Существует две адресные операции:

  1. получение адреса переменной. производится с помощью &. Возвращает адрес младшего байта.

  2. получение значения по заданному адресу P с помощью операции *P. P – указатель или адресное выражение.

Действие операции:

  1. расчитывается адресное выражение

  2. в памяти отыскивается байт с полученным адресом

  3. из этого байта извлекается хранимое там значение

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

2.Переменная указатель

Указатель – специальный вид переменной, которая предназначается для хранения адресов других переменных.

Запись: тип *имя;

Независимо от типа переменной - указателя, она всегда занимает 2 байта.

3.Операции над переменными указателями

Арифметические операции над переменными указателями

Увеличение значения указателя на единицу(P++) приводит к прибавлению количества байт, занимаемых переменной, на которую указывает данный указатель (соответствует типу).

4.Указатели и массивы

В языке Си имя массива – это указатель-константа на первый элемент массива.

При этом для двухмерного массива запись его имени с одним индексом задаёт адрес начала соответствующей строки.

Зная адрес массива можно определить адрес любого его элемента, производя арифметические операции с его указателями.

К элементам массива обращаемся, используя адресные выражения:

  1. для одномерного массива A[i] == *(pta+i)

  2. для двумерного массива A[i][j] == *(pta+i*n+j), где n – количество столбцов массива.

Функция – это часть программы, которая описывает выполнение заданного набора действий.

Любая программа на языке Си содержит хотя - бы одну функцию – main.

Виды функций:

  1. Стандратная – это готовые к использованию функции (scanf, sin, cos … ). Размещаются в заголовочных файлах при помощи директивы #include (подключение файла). Для использования функции её нужно вызвать, указав её имя и в круглых скобках указав её параметры.

  2. Пользовательские – новые функции, разработанные программистом.

Для использования необходимо:

  1. Описать функцию

  2. Вызвать функцию, задав её конкретные параметры.

5.Описание функции

тип имя(тип1 арг.1, тип2 арг.2, тип3 арг.3,…) //заголовок функции

{ описание1; //описание

Описание М; //описание внутренних переменных

Оператор1; //выполняемая часть

Оператор N; }

В качестве типа функции используют любой стандартный тип или специальный тип void. Если тип не указан, то поумолчанию – int

В круглых скобках – список формальных параметров. Тип – тип передаваемого параметра. Арг. – имя этого параметра.

Функция може быть описана:

  1. ДО функции main()

void func(…) {…}

void main (…) {вызов func(); }

  1. ПОСЛЕ функции main()

void func(тип1, тип2, тип3*) //прототип функции

void main(…) { вызов func(); }

void func(…) { … }

Тип функции, её имя, количество и типы аргументов должны соответствовать прототипу.

6.Варианты вызова функции.

При вызове функции ей передаются конкретные значения, называемые фактическими параметрами.

Количество и тип передаваемых значений должны соответствовать списку формальных параметров.

Формы вызова:

  1. Если функция имеет тип void, то её вызов – самостоятельный оператор: имя(факт_арг1, факт_арг2,…)

  2. Функция имеет определённый тип(не void). Вызов не является самостоятельным оператором, а записывается внутри другого оператора: u=имя(факт_арг1, факт_арг2,…);

7.Механизм передачи параметров в функцию и обратно

Для передачи параметра используется специальная область динамической памяти, которая называется СТЭК.

В стэк данные записываются по правилу LIFO(Last Input First Output)

При передаче данных в стэк записывается копия передаваемого параметра.

Void func(int arg1, int arg2, int *arg3) { *arg3=arg1 + arg2; }

8.Варианты описания и использования функций. Функция возвращает результат через своё имя.

1)При описании функция должна иметь определённый тип.

2)В теле функции обязательно должен присутствовать оператор return

3) Вызов функции не является самостоятельным оператором, а осуществляется внутри другого оператора.

Функция должна иметь тип возвращаемого значения.

9.Варианты описания и использования функций. Функция возвращает одно или несколько значений через аргументы.

1) Функция должна иметь тип void

2) Значения, возвращаемые через аргументы, должны быть описаны в списке формальных параметров как указатели на возвращаемый тип. void func(int k, float *ptf, float t)

3) Вызов функции является самомтсоятельным операторм.

При этом в качестве фактического параметра возвращаемого значения передаются адреса переменных (&ptf).

10.Варианты описания и использования функций. Аргументом функции является одномерный массив.

Одномерный массив в качестве аргумента функции можно передать 3-я способами:

  1. Массив с фиксированным количеством элементов.

В теле функции к элементам массива обращаются привычным способом: имя массива[индекс]

При вызове функции в качестве фактического параметра передаётся имя массива. Способ нерационалный, так как не позволяет обрабатывать массив большего размера.

  1. Массив с неопределённым количеством элементов.

В этом случае надо передавать еще один аргумент, который равен количеству элементов массива. void func(float a[ ], int n)

В теле функции к элементу массива обращаются привычным способом.

  1. Массив описывается как указатель на начало массива.

В этом случае необходимо обязательно передавать количество элементов. void func(float *pta, int n)

Внутри функции к элементам массива можно обращаться двумя способами:

  1. *(pta+i) == a[i]

  2. pta[i]

При вызове такой функции передаётся адрес нулевого элемента массива func(&t[0],200);