| int *pi; | // Указатель на int |
| char *ppc; | // Указатель на указатель на char |
| int* p, s; | // Плохой стиль объявления, s – не указатель! |
| int *p, s; | // Видно, что s – не указатель |
| int *p, *s; | // Два указателя |
| char *names[] = {"John", "Anna"};; | // Массив указателей |
|
int a, *p; |
|
| p = &a; | // Переменной p присваивается адрес переменной a |
| *p = 0; |
// Значение по адресу, находящемуся в переменной p // (т.е. значение переменной а) становится равным 0 |
| void f(int *pi) | |
|
{ void *pv = pi; |
// Правильно – неявное преобразование типа из int* в void* |
| *pv; | // Ошибка – нельзя разыменовывать void* |
|
pv++; |
// Ошибка – нельзя произвести инкремент void* |
| int *pi2 = static_cast<int*>(pv); | // Явное преобразование в int* |
| double *pd1 = pv; | // Ошибка |
| double *pd2 = pi; | // Ошибка |
| double *pd3 = static_cast<double*>(pv); | // Небезопасно! |
| } |
| void f(char *p) | |
|
{ char s[] = "const"; |
|
| const char *p1 = s; | // Указатель на константу |
| p1[3] = 'r'; | // Ошибка - p1 указывает на константу |
|
p1 = p; |
// Правильно |
| char * const p2 = s; | // Константный указатель (инициализация необходима) |
| p2[3] = 'r'; | // Правильно |
|
p1 = p; |
// Ошибка - p2 является константой |
| const char * const p3 = s; | // Константный указатель на константу |
| p3[3] = 'r'; | // Ошибка - p3 указывает на константу |
| p3 = p; | // Ошибка - p3 является константой |
| } |
|
int a[100], n, *end, *p; |
|
| end = a + n; |
// n - количество элементов массива a. Имя массива является адресом его начала (см. лекцию 3). // Таким образом, end - адрес элемента, находящегося после последнего элемента массива. |
| for (p = a; p < end; p++) | |
| printf("%4d", *p); |
|
void f(int x) { ... } |
|
|
void (*pf)(int); |
// Указатель на функцию. Скобки обязательны! |
| void g() | |
| { pf = &f; | // pf указывает на функцию f |
| pf(0); | // Вызов функции f через указатель pf |
| } |
|
void (*pf)(int); |
|
|
void f1(int x) { ... } int f2(int x) { ... } void f3(char x) { ... } |
|
| void f () | |
| { pf = &f1; | // Правильно |
| pf = &f2; | // Ошибка - не тот возвращаемый тип |
| pf = &f3; | // Ошибка - не тот тип параметра |
| } |
| int a = 10; | |
| int &r = a; | // Объявляем и инициализируем ссылку |
|
r++; |
// Значение переменной а становится 11 |
| void f(double &a) { a += 3.14; } | |
| double d = 0; | |
|
f(d); |
// d = 3.14 |
| int v[20]; | |
| int& f(int i) { return v[i]; } | |
| f(3) = 7; | // Элементу массива v[3] присваивается 7 |
| class X { ... }; | // Описание большого класса |
| int f (const X& x) { ... } | |
| 'a' | // Символьная константа - один символ |
| "a" | // Строковый литерал - массив из двух символов 'a' и '\0', заменяется на адрес. |
| char str[51]; | // Объявление строки |
| char *str; | // Нельзя, т.к. не выделяется память под элементы строки |
| char *str = "abcd"; | // Можно, но очень осторожно! |
| char *str1 = "abc", *str2 = "abc"; | // Не известно, будет ли выполняться str1 == str2? |
| char *str = "С & С++"; | |
| str[2] = '?'; | // Ошибка времени выполнения! |
| char str[] = "С & С++"; | // Массив из 8 символов |
| str[2] = '?'; | // Правильно |
| const char *error_massage() | |
| { return "Недостаточно параметров"; } | // После выхода из функции память, содержащая строку, не будет освобождена |
|
|
int strlen(const char *str) | – определение длины строки; |
|
|
int strcmp(const char *str1, const char *str2) | – сравнение строк; |
|
|
char *strcpy(char *str1, const char *str2) | – копирование str2 в str1; |
|
|
char *strcat(char *str1, const char *str2) | – конкатенация строк; |
|
|
char *strchr(const char *str, char c) | – поиск символа в строке; |
|
|
char *strstr(const char *str1, const char *str2) | – поиск подстроки str2 в str1. |
|
|
функция scanf с форматом %s | – ввод строки до пробела или другого разделителя; |
|
|
char *gets (char *buffer) | – ввод строки (которая может включать пробелы); |
|
|
char *fgets(char *string, int n, FILE *stream) | – ввод строки из файла, n задаёт максимальное количество символов для ввода; |
|
|
функция printf с форматом %s | – вывод строки с форматированием; |
|
|
int puts(const char *string) | – вывод строки; |
|
|
int fputs(const char *string, FILE *stream) | – вывод строки в файл. |