2012-03-12 4 views
0

데이터 버퍼 (패킷으로 사용됨)에서 현재 위치를 추적해야하므로 bufferLoc 및 dataBuffer라는 두 변수를 사용하고 있습니다.C++ 주소 처리 (포인터)

char dataBuffer[8192]; 
char** bufferLoc; 

bufferLoc을 사용하여 dataBuffer의 시작 위치를 가리키고 있습니다. 그러나 bufferLoc를 증가 시키더라도 메모리의 실제 주소에는 영향을 미치지 않습니다.

bufferLoc = (char**)&dataBuffer; 

cout << &bufferLoc << endl; 

bufferLoc++; 

cout << &bufferLoc << endl; 

이 두 인쇄물은 동일한 위치를 출력합니다. 내 오류가 버퍼 캐스팅 자체, 또는 완전히 다른 무언가와 함께해야합니까?

도움 주셔서 감사합니다.

답변

2

dataBuffer를 한 번에 한 바이트 씩 검사하려는 경우 두 번째 변수는 포인터가 아닌 포인터 여야합니다.

char* bufferLoc; 

다음 앰퍼샌드없이 인쇄 : 당신이 부호없는 INT *

+0

그와'& bufferLoc'이 출력되고있는 것입니다. 포인터의 ** 주소 ** (스택 **)입니다 ... – mpontillo

+0

왜'unsigned int *'로 변환 했나요? – Hurkyl

+0

@Hurkyl 왜냐하면 캐스팅하지 않고 주소 대신 문자열을 출력하기 때문입니다. – alexisdm

0

cout << &bufferLoc << endl;

캐스팅하지 않는 cout을 텍스트로 변수를 인쇄 할 것이다

cout << (unsigned int *)bufferLoc << endl; 

노트 bufferLoc의 주소를 인쇄합니다. 이 주소는 항상 같습니다. 당신은 bufferLoc에 저장된 값을 인쇄 할 수 있습니다

cout << bufferLoc << endl;

이 값이 처음의 DataBuffer의 주소입니다, 당신이 그것을 증가 할 때, 그것은 두 번째 인쇄 문에 4 바이트 커집니다.

dataBuffer 자체는 8192 바이트의 char 배열에 대한 포인터를 저장합니다.

char *bufferLoc = dataBuffer;

이 값을 증가 : 당신이하고 싶은이 값을 얻는 것입니다. bufferLoc의 타입은 문자 배열 (dataBuffer와 마찬가지로)에 대한 포인터입니다. dataBuffer에 저장된 주소를 bufferLoc에 할당 한 후 첫 번째 요소를 인쇄 할 수 있습니다 (예 : cout << bufferLoc[0] << end).