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 - символ