2012-09-10 2 views
0

Sry, 이것은 어딘가에 대답해야하지만 찾지 못했습니다.해당 포인터에서 포인터로 가리키는 값의 주소를 얻는 방법

나는 코드가 있습니다

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은 원하는 값을 반환하지만 flop1을 증가시킨 후에도 * tableCards [2]는 동일하게 유지됩니다.

tableCards[2] = & (* flop1);은 int pointer tableCards [2]에 * flop1이 가리키는 값의 주소를 할당하지만 flop1을 증가시킨 후에 tableCards [2] 값은 동일하게 유지 될 것이라고 생각했습니다. 포인터 대신 포인터의 배열을 사용하고 싶지 않습니다. 4/9 값은 int가 아니라 int 일뿐입니다.

편집 : tableCards [9]는 tableCard [48]와는 다른 배열입니다. 그리고 sry,이 질문은 대답과 대답을 볼 때 혼란스러워해야합니다.

+0

당신이 여기서하려고하는 것을 매우 혼란스럽게합니다. 상수 int ('const int * []')에 대한 포인터 배열을 정말로 원하십니까? 해당 코드가 컴파일됩니까? 사실, 당신은'const int **'에'const int **'를 할당하고 있습니다. 자신에 대한 수정, 컴파일 될 수는 있지만 여전히 권장되지 않습니다. –

+0

sry, tableCard [48]은 int –

+0

에 대한 포인터의 배열입니다. 혼란 스럽지만 문제없이 작동합니다. 잘 모르겠습니다. 권장하지 않는 것이 있습니다. 내 유일한 문제는 flop1 값을 다른 int 포인터로 변경하여 flop1을 증가시킬 때 anothers 포인터 값을 변경하여 flop1이 다른 값을 가리킨다는 것입니다. : –

답변

1

이 컴파일 안 : 당신이 & 그것을 참조 할 때

int * flop1 = & tableCard[0]; 

tableCard[0]의 유형은 int*이다, 그래서 그것은 int**된다. 해당 번호를 int*에 지정합니다. 적어도 컴파일러 경고를 생성해야합니다.

그래서, 주소 tableCard[0]flop1 점, *flop1 당신에게 tableCard[0]에 저장된 값 (포인터)를 제공하고, **flop1 당신에게 그 tableCard[0] 포인트 값을 제공합니다. 그러나 flop1int** 대신에 int*이라는 잘못된 유형을 지정 했으므로이를 수행 할 수 없습니다.

난 당신이 다른 배열을 가지고 당신이 만든 주석에 기초 :

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

지금, 당신은 flop1은 그냥 변경 증가 할 때 :

int * tableCard[48]; 

나는 무엇을 당신이 의미하는 것은 생각 포인터 tableCards[2]의 포인터는 여전히 tableCard[0]가 가리키는 것과 같은 값을 가리 킵니다.

는하지만 이것은 매우 나쁜 것입니다 :

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

flop1tableCard[0]에 저장된 포인터이다. 당신이 그것을 증가시키고 그것을 사용할 때, 그것을 배열로 다루고 있습니다. 어쩌면? 하지만 그렇지 않을 수도 있습니다. flop1이 (가) 지금 가리키는 메모리를 모른다. 그래서 실제로이 코드를 달성하기 위해 노력 수 있습니다 무엇에 대해 생각을 더 가진 후

[편집] ...

을, 당신은 flop1을 기대하는 경우 지금 당신이 필요로하는, 두 번째 배열 요소를 가리 키도록 이중 포인터 (int**)를 사용합니다.즉, flop1은 이제 요소가 아닌 tableCard 배열의 반복자입니다. 따라서 증가시킬 때 tableCard[1]에 저장된 포인터를 가리키고 tableCards[2]에는 아직 값을 포함하지만 (가리 키지는 않음) tableCard[0].

이 경우
int tableCard[48]; 

, 코드가 다른과 올바른합니다 : 추론에 근거

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

또한 편집은, 다시 한번 ... 어쩌면 당신이 tableCard 배열로 정의 할 것인지 의심 다른 변경은 필요하지 않습니다. 아마도, 아마도. 전체적으로 조금 의심스러운 것 같습니다.

+0

sry, tableCard [48] int에 대한 포인터의 배열입니다, 내가 그것을 편집, 슬리 –

+0

당신은 무엇을 호출합니까 ints, @ LukasSalich에 대한 포인터 배열? 우리는 여러분이 ints (int * [])에 대한 포인터 배열을 사용하고 있다는 것을 알고 있습니다. –

+1

아, 미안, 'tableCards'와'tableCard'의 차이점을 찾아 보지 못했습니다. 비슷한 이름을 사용하는 것은 좋지 않습니다. 어쨌든, 똑같이 적용됩니다. 모든 카드 배열이 int 포인터 인 경우 이중 포인터 사용에 대한 내 대답 끝 부분의 편집을보십시오. 'tableCard [0]'을 사용하도록 고칩니다. – paddy

관련 문제