Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
62
Добавлен:
30.05.2015
Размер:
3.61 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Основы программирования и алгоритмические языки

(лекции по курсу Информатика для бакалавров направления 140800 )

Преподаватель каф. ЭАФУ

Нагайцева Ольга Викторовна

Томск 2012

составные типы языка Си:

массивы

указатели

функции пользователя

структуры

битовые поля

объединения

оператор описания типа

классы памяти

преобразование типов

директивы препроцессора

2

это составной тип данных, состоящий из

Массив – элементов одного и того же типа (элементы в памяти

располагаются подряд)

Оператор объявления массива:

Обращение к элементу массива:

тип_данных имя [n1][n2]…[nk];

имя_массива [i1][i2]…[ik]

 

где

где

ni – размерности массива

0 ij nj-1

k – мерность массива

nj – максимальное значение j-го

индекса массива

!!!!!! элементы массива нумеруются с 0 до ni-1 Примеры:

int mass[10]; // описание одномерного массива

float A[10][9]; // описание двумерного массива

A[1][3]=5; mass[9]=2; // обращение к элементам массивов

3

 

 

 

 

 

Указатель –

это объект заданного типа, который содержит

 

 

 

адрес другого объекта, т.е. адрес ячейки памяти

 

 

 

 

 

 

 

 

 

Оператор объявления указателя:

тип данных *имя указателя;

Примеры:

int *p; // указатель на переменную типа int

struct {int x,y;} *p; //указатель на структуру

complex *p; // указатель на пользовательский

тип complex

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

Операция & - «взять адрес»

Операция * - «взять значение, по указанному адресу»

4

Оперативная

Пример 1

# include <stdio.h> main ()

{

float x = 10.1, y; float * pf ;

pf = &x ; y = *pf ;

printf(“x = %f y= %f”, x, y); // Результат: x=10.1; y=10.1; pf=632

}

5

Над указателями можно производить:

арифметические операции:

сложения и вычитанияоперации (++) и (--)

операции отношения:

<, >, < =, > =, =, = =, ! =

Пример 2:

# include <stdio.h> main()

{

int *p; int x; p = &x;

printf (“%p”, p); ++p;

printf (“%p”,p);

}

Оперативная

память

6

Динамический объект – объект создаваемый в процессе выполнения программы

Функции динамического выделения памяти:

char * malloc(size);

char * calloc(nelem, elsize);

обе функции возвращают указатель на созданный динамический объект

где

sizeof (T)

возвращает число байт необходимых для хранения

объекта T в памяти

7

Пример 1

int *P=(int *) malloc(sizeof (int));

Пример 2 (Объявление одномерного массива) int *r = (int*) malloc (n*sizeof(int));

или

int *r = (int*) calloc (n, sizeof(int));

Пример 3 (Объявление двумерного массива) int **r = (int**) malloc(n*sizeof(int*));

for (i=0; i<n; i++) r[i] = (int*) malloc(n*sizeof(int));

free(Т) – функция явного освобождения памяти от динамического объекта Т

Пример free(P);

Указание на произвольную ячейку памяти

Например, определен указатель

int *p;

тогда указатель на ячейку памяти 0777000 можно получить с помощью следующего оператора:

p=(int*)0777000;

8

имя массива

это указатель-константа, который содержит адрес его первого элемента

Соответственно

действие записи:

имя_массива [индекс];

Пример 1 int mas[3]; int *ptr;

ptr = mas; // присваивает адрес указателю

// следующие операции дадут один и тот же результат:

mas[2] = 20; *(ptr + 2) = 20;

// следующая операция прибавит 2 к первому элементу:

*ptr=*ptr + 2;

массив

можно рассматривать как

индексированный указатель

можно объяснить так

*(имя_массива + индекс);

9

Операторы

int mas[ ]; и int *mas;

оба объявляют mas указателем

!!!!!!!Нужно помнить!!!!!

mas[ ] – указатель-константа*mas – указатель-переменная

Пример 2

int mas[ ] = {1, 2, 3, 4};

int *ptr=(int*)malloc(sizeof(n*sizeof(int));

mas= ptr; // недопустимый оператор ptr=mas; // опасный оператор

Пример 3

ptr++ // допустимая конструкция mas++ // запрещенная конструкция

ptr + i; mas + i; // разрешенные операции

для любого массива соблюдается:

имя_массива == &имя_массива==&имя_массивах[0]

10

 

Оперативная

 

int mas[2][2]; // объявление двумерного массива

память

int *ptr; // объявление указателя

 

ptr = mas; // указателю присваивается адрес первого

 

элемента массива

 

(ptr = = mas = = &mas[0][0])

ptr +1; // увеличим значение указателя на 1

(ptr = = mas = = &mas[0][1])

ptr + 2; // увеличим значение указателя на 2

(ptr = = mas = = &mas[1][0])

ptr + 3; // увеличим значение указателя на 3

(ptr = = mas = = &mas[1][1])

т.о. многомерный массив можно представить как массив массивов

11