Трудно понять принцип приоритета 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
здесь).