2009-08-20 5 views
2

CreateFileMapping 함수는 메모리 매핑 파일에 대한 포인터를 반환하며 배열로 해당 메모리 매핑을 처리하려고합니다. C++의 배열로 포인터 변환

는 여기에 내가 기본적으로 수행 할 작업은 다음과 같습니다

char Array[] = (char*) CreateFileMapping(...); 

을 분명히 나는 ​​단순히 내 팔을 흔들고 포인터는 이제 배열임을 선언 할 수 없습니다 제외.

내가 어떻게이 작업을 수행 할 수 있는지 알고 계신가요? 큰 파일에 너무 많은 메모리를 사용하기 때문에 포인터가 가리키는 값을 배열에 복사하고 싶지 않습니다.

감사합니다.

답변

22

필요하지 않습니다. 포인터를 배열처럼 인덱싱 할 수 있습니다.

char* p = (char*)CreateFileMapping(...); 
p[123] = 'x'; 
... 
+0

굉장합니다, 감사합니다! –

+0

배열과 포인터에서 sizeof()를 호출하면 다른 값이 반환됩니다. 포인터는 배열이 아닌 포인터의 크기를 반환합니다. 즉, 배열 길이 트릭을 수행하는 대신 배열의 크기를 전송해야합니다. 'char (* p) [] = ...'를 실행하여 진정한 포인터 포인터를 생성 한 다음'(* p) [123] = 'x';를 사용하여 멤버를 얻을 수 있습니다. 그것을 따라 가지 않고 크기를 얻는다. –

1

어떻게 포인터가 배열과 다른가요?

char *Array = (char*)CreateFileMapping(...);

뭐가 잘못 됐는지 당신은 Array 더 많거나 적은 지금부터 배열을 처리하는 것처럼 처리 할 수 ​​있습니다.

+0

차이가 있습니다. 배열은 sizeof()를 호출 할 수 있지만 포인터는 배열이 아닌 포인터의 크기를 반환합니다. 따라서 메모리에있는 대상 데이터 청크의 길이는 배열에 대한 포인터에서 검색 할 수 없습니다. 불행히도 포인터를 배열로 변환하지 않고 배열의 크기가 아닌 실제 배열로 변환 할 수는 없지만 더 이상 변환 할 필요가 없습니다. –

+0

@ user1884803, 예, 질문의 차이점이 없습니다. 배열과 포인터 사이에 있지만이 컨텍스트의 차이점은 무엇입니까? –

5

C/C++에서 포인터와 배열은 똑같지 않습니다.

하지만 귀하의 경우에는 귀하의 목적에 따라 다릅니다.

포인터가 있습니다.

아래 첨자를 붙일 수 있습니다.

예.

포인터 "안녕"의 시작 숯불 * 포인터 지점 [0]를 단지 치료 첫 문자 "H"

포인터 [1] 번째 문자 인 'E'

인 당신이 배열에 대해 생각할 때.

당신은 C 스타일 캐스트 사용할 수 있습니다
+2

언어에 대한 포인터와 배열은 똑같습니다. 배열은 시리즈의 첫 번째 객체에 대한 포인터입니다. – user142350

+4

@ dnh828, 틀렸어. 배열과 "같은"타입의 포인터에 대해'sizeof'를 사용해보십시오. 또는 한 배열을 다른 배열에 할당하십시오. 배열에 대한 포인터는 포인터에 대한 포인터와 구별됩니다. 등등. –

+8

보다 구체적으로, C/C++에서 _decay_는 _ 특정 컨텍스트 _에 포인터로 _ 배열됩니다. 항상 그런 것은 아닙니다. –

1

:

char *p = (char*)CreateFileMapping(...); 
p[123] = 'x'; 

또는 선호 재 해석 캐스트 :

char *p std::reinterpret_cast<char*>(CreateFileMapping(...)); 
p[123] = 'x'; 
2

"C/C++에서이 포인터와 배열이 같은 것이 아니다." 사실이지만 배열의 변수 이름은 포인터 const와 동일합니다 (이것은 내가 사용한 Coriolis C++ Black Book에서 가져온 것입니다). 위트로 :

char carray[5]; 
char caarray2[5]; 
char* const cpc = carray; //can change contents pointed to, but not where it points 

/* 
    cpc = carray2; //NO!! compile error 
    carray = carray2; //NO!! compile error - same issue, different error message 
*/ 

cpc[3] = 'a'; //OK of course, why not. 

희망이 도움이됩니다.

+0

cpc [3] = 'a'; 오류가 발생합니다 .. 다른 주소를 가리 키도록 포인터를 만들 수 있습니다 .. – Angus

-1

또한이 답변을 검색하고 있습니다. 당신이해야 할 일은 당신 자신의 타입의 배열을 만드는 것입니다.

static const int TickerSize = 1000000; 
    int TickerCount; 
    typedef char TickerVectorDef[TickerSize]; 

포인터를이 새로운 유형으로 전송할 수도 있습니다. 그렇지 않으면 "컴파일러 오류 C2440"이 표시됩니다. 그것은 고정 된 크기의 배열이어야합니다.포인터로만 사용하면 실제 메모리는 할당되지 않습니다 (포인터 자체는 4-8 바이트 제외).