я не понимаю, что означают следующие объявления указателя переменной в c - PullRequest
2 голосов
/ 08 декабря 2010
  1. char(*p)[15];
  2. char(*p)(int *a);
  3. int(*pt)(char*);
  4. int *pt(char*);

кто-нибудь поможет?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

Основное правило: Начните с идентификатора и читайте вправо, когда можете, влево, когда нужно.

  1. Начать с идентификатора *. Скажите это, а затем "это". Поместите свою «левую ногу» на один символ слева от нее.
  2. Читайте вправо, пока не дойдете до конца или ). Поместите свою «правую ногу» на один символ справа от того места, где находится ), если это то, что вы ударили.
    • Если вы видите [42], когда читаете вправо, произнесите «массив из 42».
    • Если вы видите (, когда читаете вправо , говорите «взятие функции», затем повторяйте, чтобы сказать тип каждого параметра (но пропустите сами имена параметров), затем «и возвращение».
  3. Теперь прыгайте на левую ногу и читайте влево, пока не дойдете до старта или (. Поместите левую ногу на один символ слева от (, если это то, что вы нажали.
    • Если вы видите * или & при чтении влево, произнесите «указатель на» или «ссылку на».
    • Все, что вы видите (например, const, int, MyFoo), просто скажите это.
  4. Если вы нажмете начало, все готово. В противном случае, прыгайте обратно на правую ногу и переходите к 2.

* Если нет идентификатора, представьте, куда он должен идти - хитрый, я знаю, но есть только одно легальное размещение.

Следуя этим правилам:

  1. p - указатель на массив из 15 символов
  2. p - указатель на функцию, принимающий указатель на int и возвращающий char
  3. pt - указатель на функцию, принимающий указатель на char и возвращающий int
  4. pt - функция, принимающая указатель на тип char и возвращающая указатель на int
1 голос
/ 08 декабря 2010

Простой способ выяснить, на какой тип указателя указывает, это просто удалить * и посмотреть, что осталось:

  1. char p[15];
  2. char p(int *a);
  3. int pt(char*);
  4. int pt(char*);

То, что вы получите, - это объявление переменной типа, на который будет указывать ваш указатель. Или нет в четвертом случае:

int *pt(char*);

- это прототип функции, а не допустимое объявление указателя.

EDIT:

Причина в том, что без скобок вызов функции "operator" имеет приоритет над оператором разыменования указателя. В приведенном выше случае декларация на простом английском языке:

У нас есть функция pt(char *), которая возвращает int *

В то время как

int (*pt)(char *);

переводится как:

*pt - это функция, которая принимает char * и возвращает int.

Что по сути означает, что pt сам по себе является указателем на этот тип.

0 голосов
/ 08 декабря 2010
  1. Указатель на массив из пятнадцати символов.
  2. Указатель на функцию.Принимает указатель типа int и возвращает char
  3. То же, что 4
  4. Прототип функции.Принимает char и возвращает int.
...