Путаница указателя на функцию C, что подразумевается под «указателем уровня переменной»? - PullRequest
0 голосов
/ 27 февраля 2012

Это код:

char *(*strcpy_ptr)(char *dst, const char *src); Pointer to strcpy-like function

И учебник говорит:

Обратите внимание на круглые скобки вокруг * strcpy_ptr в приведенном выше объявлении. Они отделяют звездочку, указывающую тип возврата (char *) от звездочка, указывающая уровень указателя переменной (* strcpy_ptr - один уровень, указатель на функцию).

* * 1010

Я заблудился на этом - где находится «указатель функции» и что такое «уровень указателя»?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2012

Вы объявляете переменную strcpy_ptr.Вы хотите, чтобы эта переменная была указателем на функцию, возвращающую char*.Если бы вы сделали это без скобок следующим образом:

char **strcpy_ptr(char *dst, const char *src);

Это был бы прототип функции, которая возвращает char** - не то, что вам нужно.Скобки должны сгруппировать одну звезду с переменной и отделить звезду от возвращаемого типа .

Помните, что указатели объявляются так:1016 *

Где T - некоторый тип.Чем больше звезд вы добавляете, тем больше уровней косвенности вы добавляете, прежде чем, наконец, доберетесь до фактического T.Таким образом, char **c будет указателем на указатель на char.То же самое относится и к указателям на функции: T - это char*, а *var должны быть разделены круглыми скобками, потому что C не знает пробелов.C просто добавил немного дополнительного синтаксиса, чтобы указать, какой тип и сколько аргументов принимает функция, на которую указывает указатель.Это только часть того, как работает С.

1 голос
/ 27 февраля 2012

@ Адель: все почти все части вышеприведенных комментариев имеют некоторый смысл (с несколькими придирчивыми исключениями, такими как C не понимает пробелов), тем не менее, я предлагаю вам прочитать «Язык программирования C» Кернигана и Ричи, 2-й издание, глава 5.11 и особенно глава 5.12 (Сложные выражения-p122): вы найдете множество сложных примеров, и важно понимать каждый из них.

специально, понимая разницу между:

  1. char (* (* x ()) []) ()

и

2.char (* (* x []) ()) []

cforfun.

1 голос
/ 27 февраля 2012

Без паренов вы бы получили: ** strcpy_ptr

Это указатель на указатель или двойную косвенность. Я думаю, что «один уровень» означает, что существует только один уровень косвенности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...