В чем разница между * p и p *? - PullRequest
2 голосов
/ 12 февраля 2011

Является ли p* другим способом использования указателей?

Является ли *p переменной указателя, отличной от p*?

Ответы [ 4 ]

9 голосов
/ 12 февраля 2011

*p разыменовывает указатель, p* умножает указатель на что-то.

8 голосов
/ 12 февраля 2011

Синтаксис

*ptr

Означает разыменование указателя для получения объекта, на который он указывает.

Синтаксис

ptr*

Не имеет смысла в C, если только это не начало умножения. Например:

*ptr*137;

Означает «разыменование ptr, затем умножьте значение, на которое оно указывает, на 137.». Однако за пределами этого контекста размещение звезды после переменной-указателя недопустимо.

Теперь допустимо ставить звездочку после типа, как в

int*

Который описывает тип, который является указателем на тип слева от звезды. Интересно, что это означает, что вы не можете поставить звездочку перед типом (это недопустимо) или звездочку после указателя (так как оператор разыменования идет влево). Причина частично связана с идеей, что в C типы должны имитировать то, как они работают. То есть, если у вас есть

int *p;

Тогда синтаксис является визуальной подсказкой, что, чтобы добраться до целого числа, на которое указывает p, вы должны поставить перед ним звезду.

3 голосов
/ 13 февраля 2011

Префикс против двоичного выражения против выражений типа

* - это префиксный унарный оператор для указателей и инфиксный унарный оператор для умножения.Существует особый случай, когда чистый тип - это все, что нужно, поэтому можно увидеть такие вещи, как sizeof(int *) или void f(int *, char *), но это все еще префикс * для безымянного идентификатора.

Разыменование постфиксав альтернативной вселенной

Интересно отметить, что * мог быть постфиксным унарным оператором , и в этом случае некоторые вещи в языке могли бы работатьнемного лучше.Во-первых, оператор -> не был бы необходим:

p->field
p*.field // like Pascal's p^.field

Даже сегодня вы можете использовать:

p[0].field

Также ...

(*x)->y // today
x**.y   // alternate universe

*x->y   // today
x*.y*   // alternate universe

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

int *fp();
int fp()*;    // alternate universe

int (*pf)();
int pf*();    // alternate universe

int *(*pfp)();
int pfp*()*;  // alternate universe

1. См. Развитие языка C. , Деннис М. Ритчи

2 голосов
/ 12 февраля 2011

Полагаю, вы уже знаете, что это операция умножения:

p * 3;

Другой случай:

Получить значение, из которого 'p' указывает на:

int i = 1;
int *p;       // Declare p as an int * (pointer to an int)
p = &i;       // Set the address p points to

printf("The value of p is %d\n", *p);  // fetch value from p

Есть еще один случай, который вы могли видеть p *

typedef int p;

p *aPtr = &i;

В этом случае мы создали другое имя (синоним) для типа 'int' с именем 'p'. Поэтому здесь, когда мы говорим «p», он переводится компилятором в «int». Таким образом, мы также можем сказать «р *».

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