Извините, это должно быть где-то ответом, но я не нашел его.
У меня есть код:
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]. И извините, этот вопрос должен сбивать с толку, когда я вижу комментарии и ответы.
Это не должно компилироваться:
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];
В этом случае ваш код должен быть корректным, без каких-либо других изменений. Ну, предположительно. Все это кажется немного подозрительным.
Других решений пока нет …