мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| c:c_ultimate_guide:pointers [2025/10/10 15:34] – radi0dev | c:c_ultimate_guide:pointers [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 88: | Строка 88: | ||
| Вместо %%*p[i]%% для доступа к элементу из array мы могли бы написать %%**(p+i)%%: | Вместо %%*p[i]%% для доступа к элементу из array мы могли бы написать %%**(p+i)%%: | ||
| * '' | * '' | ||
| - | *'' | + | * '' |
| - | * '' | + | * '' |
| ===== Указатель на массив ===== | ===== Указатель на массив ===== | ||
| Строка 103: | Строка 103: | ||
| int (*pa3)[3] = & | int (*pa3)[3] = & | ||
| + | </ | ||
| + | |||
| + | ==== Указатель и массив строк ==== | ||
| + | |||
| + | Соответственно если указатель типа char можно представить в виде строки, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main(void) { | ||
| + | char *fruit[] = {" | ||
| + | for(int i=0; i < 5; i++) { | ||
| + | printf(" | ||
| + | // аналогично | ||
| + | printf(" | ||
| + | } | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Указатели на указатели ===== | ||
| + | |||
| + | Если указатель хранит адрес переменной, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | | ||
| + | int main(void) { | ||
| + | int x = 22; | ||
| + | int *px = &x; // указатель px хранит адрес переменной x | ||
| + | int **ppx = &px; // указатель ppx хранит адрес указателя px | ||
| + | |||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Здесь указатель ppx хранит адрес указателя px. Поэтому через выражение *ppx можно получить значение, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Указатели на функцию ===== | ||
| + | |||
| + | Указатель на функцию представляет собой выражение или переменную, | ||
| + | |||
| + | общий синтаксис: | ||
| + | '' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | void hello() { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | void goodbye() { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | int sum(int x, int y) { | ||
| + | return x + y; | ||
| + | } | ||
| + | |||
| + | int subtract(int x, int y) { | ||
| + | return x - y; | ||
| + | } | ||
| + | |||
| + | int main(void) { | ||
| + | // определяем указатель на функцию | ||
| + | void (*message) (void); | ||
| + | | ||
| + | message=hello; | ||
| + | message(); // вызываем функцию, | ||
| + | message = goodbye; // указатель указывает на функцию goodbye | ||
| + | message(); // вызываем функцию, | ||
| + | | ||
| + | int a = 10; | ||
| + | int b = 5; | ||
| + | int result; | ||
| + | int (*operation)(int, | ||
| + | operation=sum; | ||
| + | result = operation(a, | ||
| + | printf(" | ||
| + | operation = subtract; | ||
| + | result = operation(a, | ||
| + | printf(" | ||
| + | | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Массивы указателей на функции ==== | ||
| + | |||
| + | '' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | void sum(int x, int y) { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | void subtract(int x, int y) { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | void multiply(int x, int y) { | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | int main(void) { | ||
| + | int a = 10; | ||
| + | int b = 5; | ||
| + | void (*operations[3])(int, | ||
| + | |||
| + | // получаем длину массива | ||
| + | int length = sizeof(operations)/ | ||
| + | |||
| + | for(int i=0; i < length; i++) { | ||
| + | operations[i](a, | ||
| + | } | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| </ | </ | ||