Как получить адрес значения, на который указывает указатель, из этого указателя

Извините, это должно быть где-то ответом, но я не нашел его.

У меня есть код:

const int * tableCards[9];
int hand1card1 = 0;
tableCards[0] = & hand1card1;
int hand1card2 = 1;
tableCards[1] = & hand1card2;
int * flop1 = & tableCard[0];
tableCards[2] = flop1;
cout << * flop1 << endl;
cout << * tableCards[2] << endl;
flop1++;
cout << * flop1 << endl;
cout << * tableCards[2] << endl;

tableCard[48] is an array of pointers to ints

Этот код работает, но я хочу изменить строку tableCards[2] = flop1; сделать * tableCards[2] вернуть фактическое значение элемента, указанного * flop1, В этом коде * flop1 возвращает желаемое значение, но * tableCards [2] остается неизменным после увеличения flop1.

я думал так tableCards[2] = & (* flop1); назначит адрес значения, указанного * flop1, указателю int tableCards [2], но после увеличения flop1 значение tableCards [2] останется прежним. Я не хочу использовать массив указателей на указатели вместо массивов указателей, потому что необходимые значения 4/9 — это просто целые, а не указатели на целые.

Изменить: Обратите внимание, что tableCards [9] отличается от массива tableCard [48]. И извините, этот вопрос должен сбивать с толку, когда я вижу комментарии и ответы.

0

Решение

Это не должно компилироваться:

int * flop1 = & tableCard[0];

Тип tableCard[0] является int*поэтому, когда вы ссылаетесь на это с & это становится int**, Вы назначаете это int*, По крайней мере, это должно генерировать предупреждение компилятора.

Так, flop1 указывает на адрес tableCard[0], *flop1 дает вам значение (указатель), хранящийся в tableCard[0], а также **flop1 дает вам значение, которое tableCard[0] указывает на. Но потому что вы дали flop1 неправильный тип (int* вместо int**), вы не можете сделать это.

Я основываю это на комментарии, который вы сделали, что у вас есть другой массив:

int * tableCard[48];

Я думаю, что вы хотели сделать, это:

int * flop1 = tableCard[0];
tableCards[2] = flop1;

Теперь, когда вы увеличиваете flop1 это просто меняет указатель. Указатель на tableCards[2] будет по-прежнему указывать на то же значение, что и tableCard[0] указывает на.

Но ЭТО очень капризно

flop1++;
cout << * flop1 << endl;

flop1 указатель хранится в tableCard[0], Когда вы увеличиваете это, а затем используете его, вы рассматриваете его как массив. Может быть это? Но, вероятно, это не так. Вы не знаете, что память flop1 сейчас указывает на.

[редактировать] После долгих размышлений о том, чего может пытаться достичь этот код …

Так что, если вы ожидаете flop1 чтобы теперь указывать на второй элемент массива, вам нужно использовать двойной указатель (int**). Это означает, что flop1 теперь итератор в вашем tableCard массив, а не элемент … Поэтому, когда вы увеличиваете его, он теперь указывает на указатель, хранящийся в tableCard[1] в то время как tableCards[2] по-прежнему содержит значение (но не указывает на) tableCard[0],

int ** flop1 = & tableCard[0];
tableCards[2] = *flop1;
cout << **flop1 << endl;
cout << *tableCards[2] << endl;
flop1++;
cout << **flop1 << endl;
cout << *tableCards[2] << endl;

Дальнейшие изменения, основанные на выводе еще раз … Я подозреваю, что, возможно, вы хотите tableCard массив должен быть определен как:

int tableCard[48];

В этом случае ваш код должен быть корректным, без каких-либо других изменений. Ну, предположительно. Все это кажется немного подозрительным.

1

Другие решения

Других решений пока нет …