Трудно понять принцип приоритета char (*p)[sizeof (c)];

Я изучаю указатели и, чтобы бросить вызов себе, я попытался разыменовать указатель на массив символов. В конце концов это сработало:

char (*p)[sizeof(c)];

где c-массив c []= "что-то"

мне трудно понять, как (*p)[sizeof(c)]; отличается от *p[sizeof(c)];

основываясь на том, что я знаю в настоящее время (которого не так много!) компьютер говорит это в случае (*p)[sizeof(c)];:

" p указывает на c! о, и кстати, p-это массив чего угодно sizeof (c) заканчивается тем, что".

но даже это кажется мне странным, поэтому я думаю, что я смущен тем, что строится, когда добавляются скобки.

может кто-нибудь объяснить?

полный код в контексте здесь:

#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {

    char c[] = "something";

    char (*p)[sizeof(c)]; // this works
    // char *p[sizeof(c)]; // this doesn't?

    p = &c;

    cout << p << endl;  

    cout << *p << endl;
}

4 ответов


типы В C можно прочитать с тем, что неофициально известно как вправо-влево правило. Вы начинаете с имени объявляемой переменной, затем идете направо, пока можете, затем идете налево, пока можете, и начинаете снова. Скобки останавливают вас, пока все их содержимое не будет рассмотрено.

в вашем примере:

char (*p)[sizeof(c)];
       ^               p...                          (hit ')', turn around)
      ^                is a pointer...               (hit '(', turn around and remove '()')
         ^^^^^^^^^^^   to an array of `sizeof(c)`... (end of line, turn around)
^^^^                   chars.                        nothing left, we're done!

без скобок, это становится:

char *p[sizeof(c)];
      ^^^^^^^^^^^^     p is an array of `sizeof(c)`... (end of line, turn around)
^^^^^^                 pointers to char.

что действительно совсем другая.


в этом определении

char (*p)[sizeof(c)];

вы определяете переменную p, которая является указателем (сначала вычисляется содержание скобок) на массив символов с размером [sizeof c]. На данный момент в вашем коде p не указывает нигде конкретно, поскольку он еще не инициализирован.

С другим определением

char *p[sizeof(c)];

вы определяете переменную p, которая является массивом (*оценивается позже) указателей на символ.

у вас есть указатель на массив против массива указателей.


введите несоответствие в вашем задании

p = &c;

проблема.

c - это массив из 10 символов и &c это указатель на массив из 10 символов.

на char (*p)[sizeof(c)];, p это указатель на массив of sizeof(c) (10) chars. Итак, это соответствует типу &c.

на char *p[sizeof(c)];, p это массив sizeof(c) (10) указатели. Но это не совпадает с тип &c.


принцип приоритета прост - постфиксные операторы имеют более высокий приоритет, чем префикс. * является префиксной операцией и [sizeof(c)] - это постфикс, поэтому, когда вы говорите:

char *p[sizeof(c)];

что же

char *(p[sizeof(c)]);

оператор более высокого приоритета сначала привязывается к операнду (имя Декларатора p здесь).