Язык Си. Динамические структуры данных. Указатели

Слайд 2

Статические данные

переменная (массив) имеет имя, по которому к ней можно обращаться
размер

Статические данные переменная (массив) имеет имя, по которому к ней можно обращаться
заранее известен (задается при написании программы)
память выделяется при объявлении
размер нельзя увеличить во время работы программы

int x, y = 20;
float z, A[10];
char str[80];

Слайд 3

Динамические данные

размер заранее неизвестен, определяется во время работы программы
память выделяется во время

Динамические данные размер заранее неизвестен, определяется во время работы программы память выделяется
работы программы
нет имени?

Проблема:
как обращаться к данным, если нет имени?
Решение:
использовать адрес в памяти
Следующая проблема:
в каких переменных могут храниться адреса?
как работать с адресами?

Слайд 4

Указатели

Указатель – это переменная, в которую можно записывать адрес другой переменной (или

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

char *pC; // адрес символа
// (или элемента массива)
int *pI; // адрес целой переменной
float *pF; // адрес вещественной переменной

int m = 5, *pI;
int A[2] = { 3, 4 };
pI = & m; // адрес переменной m
pI = & A[1]; // адрес элемента массива A[1]
pI = NULL; // нулевой адрес

&

scanf("%d", &m);

Слайд 5

Обращение к данным

Как работать с данными через указатель?
Как работать с массивами?

int

Обращение к данным Как работать с данными через указатель? Как работать с
m = 4, n, *pI;
pI = &m;
printf ("m = %d", * pI); // вывод значения
n = 4*(7 - *pI); // n = 4*(7 - 4) = 12
*pI = 4*(n – m); // m = 4*(12 – 4) = 32
printf("&m = %p", pI); // вывод адреса

int *pI, i, A[] = {1, 2, 3, 4, 5, 999};
pI = A; // адрес A[0] записывается как A
while ( *pI != 999 ) { // while( A[i] != 999 )
*pI += 2; // A[i] += 2;
pI++; // i++ (переход к следующему)
}

*

%p

«вытащить» значение по адресу