Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17111 / 2712 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 12:

Массивы и указатели

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Аннотация: Указатели и массивы. Массивы. Указатели. Динамические объекты. Создание динамических объектов. Доступ к динамическим объектам. Строки - дополнительные сведения о связи между указателями и массивами. Инициализация массивов и классы памяти. Функции. Операции с указателями.

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

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

Указатель на основной тип:

char *p;

Переменная р является указателем на символ, т.е. этой переменной должен присваиваться адрес символа.

Указатель на указатель:

char **t;

Переменная t - указатель на указатель символа.

Одномерный массив:

int a[50];

Переменная а - массив из 50 целых чисел.

Двумерный массив:

char m[7][50];

Переменная m - массив из семи массивов, каждый из которых состоит из 50 символов.

Массив из семи указателей:

char *r[7];

Массив r состоит из указателей на символы.

Указатель на функцию:

int (*f)();

f - указатель на функцию, возвращающую целое значение.

Массивы

Массив является сложным объектом, состоящим из объектов-компонентов, называемых элементами одного и того же типа. Простые определения массива имеют вид

Тип данных x[n1][n2]...[nk]

Где x - идентификатор, определяемый в качестве имени массива, а ni - размерности массива. Массив x называется k-мерным массивом с элементами типа тип данных. Элементы i -го измерения имеют индексы от 0 до ni-1. Тип элемента массива может быть одним из основных типов, типом другого массива, типом указателя (pointer), типом структуры ( struct ) или типом объединения ( union ). Хотя элементы массива не могут быть функциями, они могут быть указателями на функции. Ниже приведены некоторые примеры определений массива:

int page[10]; /* одномерный массив из 10 
		элементов, перенумерованный с 0 до 9 */
char line[81];
float big[10][10], sales[10][5][8]; /*двумерный 
		массив и трехмерный массив*/

Ссылки на элемент k-мерного массива x делаются с помощью следующего обозначения:

x[i1][i2]...[ik]

где ij - целое выражение, при этом 0<=ij<=nj-1, а nj - максимальное значение j -го индекса массива x. Например:

page[5]
line[i+j-1]
big[i][j]

Указывая только первые p индексов, можно ссылаться на k-p -мерный подмассив k-мерного массива (p<=k), например,

sales[i] /* ссылка на двумерный подмассив массива 
					sales */
sales[i][j] /* ссылка на одномерный подмассив */
sales[i][j][k] /* ссылка на элемент массива*/

Указатели

Указателем называется компонент заданного типа, являющийся ссылкой на некоторую область памяти. Определение указателя имеет следующий вид:

тип-данных *id1, *id2, *_, *idn

Тип переменных id1, id2, _, idn определяется как тип указателей на тип-данных. Эти переменные служат ссылками на объекты типа тип-данных. Этот тип называется базовым типом переменных-указателей. Ниже приведены несколько примеров определений указателей:

int *pi, *qi;/* указатели на целые объекты */
char *c; /* указатель на символьный объект */

Динамические объекты

Указатели используются при создании и обработке динамических объектов. Заранее определяемые объекты создаются с помощью определений. Динамические объекты, в отличие от заранее определяемых, создаются динамически и явно в процессе выполнения программы. Для создания динамических объектов служат функции malloc и calloc. В отличие от заранее определенных объектов, число динамических объектов не фиксировано тем, что записано в тексте программы, - по желанию динамические объекты могут создаваться и уничтожаться в процессе ее выполнения. Динамические объекты, в отличие от заранее определенных, не имеют имен, и ссылка на них выполняется с помощью указателей.

Значение 0 может быть присвоено указателям любого типа. Это значение показывает, что данный указатель не содержит ссылки на какой-либо объект. Попытка использовать это значение для обращения к объекту может привести к ошибке, но только в операционных системах с защитой памяти. По соглашению, для обозначения константы с нулевым значением используется идентификатор NULL, описание которого находится в библиотеке stddef.h и является системозависимым.

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Роман Алфёров
Роман Алфёров
Россия, Ярославль
Сергей Авдеев
Сергей Авдеев
Россия, г. Обнинск