Как использовать оператор адреса с приращением префикса в указателях в одном выражении? - PullRequest
0 голосов
/ 28 января 2020

Можно ли использовать оператор адреса рядом с приращением префикса для указателей в том же выражении, если да, как?

Пример,

#include <stdio.h>
#include <stdint.h>

void main() {
    uint8_t arr_var[2];
    arr_var[0] = 0xa;
    arr_var[1] = 0xf;
    uint8_t *ptr = arr_var;
    uint8_t **dptr = &(++ptr);
}

Я получаю ошибку

ошибка: в качестве унарного операнда '&' требуется lvalue

uint8_t ** dptr = & (++ ptr);

Есть ли другие альтернативы, кроме делая его 2 отдельными операторами (приращение (ptr++) и затем адрес-из (&ptr)).

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Кажется, я был сбит с толку одной разницей между C и C ++ ...

В C результат операторов увеличения или уменьшения никогда не равен lvalue , и вы можете получить только адреса lvalues.

Эта ссылка на увеличение / уменьшение явно включает пример &++a и говорит, что он недействителен.

Чтобы получить указатель на ptr Вы должны использовать обычный &ptr. До или после увеличения указатель не имеет значения, так как dptr будет указателем на сам ptr.

2 голосов
/ 28 января 2020

Проблема:

В отличие от C ++, увеличение / уменьшение указателя не возвращает lvalue в C.

Оператор addressof должен иметь lvalue в качестве операнда.

Решение:

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

uint8_t **dptr = ++ptr ? &ptr : &ptr;

Некоторые другие решения из раздела комментариев: -

Lundin : uint8_t **dptr = (++ptr, &ptr);

...