Лабораторная работа: Управляющие структуры языка "Си". Программирование с использованием указателей
Объявление указателей.
Если нужно объявить переменную для хранения, например, возраста то можно сделать это следующим образом:
int age = 20;
Такое объявление переменной age подразумевает несколько моментов. Во-первых, сообщается Си, что нужна переменная с именем age , и Си резервирует для этой переменной место в памяти. Во-вторых, Си узнает, что age будет использоваться для хранения только целых чисел. В-третьих, при объявлении эта переменная инициализируется значением 20.
Пусть нужно объявить переменную-указатель, которая не содержит возраст, а указывает на age , переменную, где находятся нужные данные. Для объявления указателя на переменную age нужно сделать следующее:
int * p _ age ;
В этой строке резервируется место для переменной с именем p_age . Однако это не обычная целочисленная переменная. Так как перед ней стоит *, Си определит, что это переменная-указатель.
Присваивание значений указателям.
Указатель может содержать адреса значений только соответствующего ему типа. Например, p_age может указывать только на целочисленные переменные. Си не инициализирует указатели при их объявлении. Если age объявлена как показано выше, и нужно, чтобы p_age содержала адрес age , нужно присвоить его переменной p_age :
p _ age =& age ;
Вместо занесения адреса переменной age в переменную p_age при помощи оператора присваивания можно одновременно объявлять и инициализировать указатели.
int age=20;
int *p_age=&age;
Можно присваивать различные значения переменной age следующим оператором:
age=35;
Либо можно сделать то же самое другим путем:
*p_age=35;
Эта строка подразумевает "взять ячейку памяти, на которую указывает p_age и занести туда значение 35".
Объявление массивов указателей.
Если нужно зарезервировать большое количество указателей для различных данных, можно объявить массив указателей, причем каждый его элемент будет являться указателем одного и того же указанного типа. Следующий пример резервирует массив из 10 указателей на переменную целого типа:
int *iptr[10];
Можно присвоить адрес любому элементу из iptr таким же образом, как и любому другому указателю, не входящему в массив:
iptr[4]=&age;
В следующей строке резервируется массив из 20 указателей на переменные символьного типа:
char * cpoint [20];
Задание:
Составить программу для определения максимального элемента одномерного массива. Массив первоначально заполняется нулями, затем данные вводятся с клавиатуры. Заменить нулем все элементы, равные максимальному. Массив задать при помощи указателя. Зарезервировать память под массив при помощи функций динамического распределения памяти.
Программа: определяет максимальный элемент одномерного массива:
#include<stdio.h>