Перейти к содержанию

C

Типы данных

  • Целое число

  • Символ

  • Массив - по сути же переменная - это адрес на первый элемент

int arr[] = {1, 2, 3, 4, 5, 6, 7}; // т.е. здесь arr - адресная переменная - int* arr
К массиву можно применить операцию индексирования
arr[1] // 2
// что равносильно 
*(arr+2)

Но есть исключения, когда массив рассматривается как единое целое, например псевдофункция sizeof * Строка - по сути массив char, в котором последним символом является \0 - string terminator (определяет конец строки)

Функции

  • main - главная функция, точка входа в программу. Имеет ряд формальных параметров (int argc, char* argv[]), где argc - это количество аргументов, а argv[]- массив символов.

Возвращает 0, если программа выполнена успешно.

Работа с указателями

  • указатель содержит адрес памяти, по которому хранятся данные: символ, массив, число и т.д.

  • тип указателя должен быть таким же, как и переменная, на адрес которой он ссылается

  • может объявляться вот так

int *pointer;
// или так
int* pointer;
// но важно помнить, что * это часть имени, а не типа, т.е. вот так будет правильно
int *p1, *p2, *p3
// а вот так нет (если мы хотим объявить 3 указателя, разумеется)
int* p1, p2, p3 // здесь адресной перемнной будет только p1
  • сохранить адрес переменной в указатель (операция взятия адреса - &)
int numbe = 15; // объявим переменную (4 байта)
int *pointer; // объявим указатель
pointer = &number; // сохраним адрес переменной в указатель
// или так
int *pointer = &number;
  • разыменовывание (dereference) указателя - получение значения, хранящегося по адресу. Для этого нужно обратиться к указателю через звездочку
printf("%d %p", *pointer, pointer); // 15 0x7fffe477f70c

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

int arr[] = {1, 2, 3};
int *p = arr;
  • чтобы перебрать массив, нужно инкрементировать указатель - адрес автоматически будет увеличиваться на 4 байта, если тип int, для примера

т.е. адерс указателя увеличивается на sizeof типа указателя

fprint("%p", *p; // 1
*p++;
fprint("%p", *p) // 2
  • указатель можно содержать адрес на переменную неопределенного типа
void* p; // в можно занести адрес на переменную любого типа
  • также справедливо и обратное, в типизированный указатель можно занести адрес на нетипизированную переменную

  • указатель может быть нулевым, т.е. гарантированно не содержать адрес

int* p = NULL; // при этом логическое значение будет false, что можно использовать в других операторах

Вывод на экран

  • printf -
  • fprintf -
%d - целое число
%p - указатель
%c - символ