C++에서 포인터를 배열로 변환
-
19-09-2019 - |
문제
CreateFileMapping 함수는 메모리 매핑된 파일에 대한 포인터를 반환하며 해당 메모리 매핑을 배열로 처리하고 싶습니다.
내가 기본적으로 하고 싶은 일은 다음과 같습니다.
char Array[] = (char*) CreateFileMapping(...);
분명히 팔을 흔들고 포인터가 이제 배열이라고 선언할 수는 없다는 점만 빼면요.
내가 어떻게 할 수 있는지 아시나요?포인터가 가리키는 값을 배열에 복사하고 싶지 않습니다. 큰 파일에 너무 많은 메모리를 사용하게 되기 때문입니다.
무리 감사,
해결책
그럴 필요는 없습니다.마치 배열인 것처럼 포인터를 인덱싱할 수 있습니다.
char* p = (char*)CreateFileMapping(...);
p[123] = 'x';
...
다른 팁
C/C++에서 포인터와 배열은 같은 것이 아닙니다.
그러나 귀하의 경우에는 귀하의 목적에 부합합니다.
포인터가 있습니다.
아래 첨자를 줄 수 있습니다.
예:char* 포인터는 "hello"의 시작을 가리킵니다.
포인터[0]은 첫 번째 문자 'h'입니다.
포인터[1]은 두 번째 문자 'e'입니다.
따라서 배열에 대해 생각하는 것처럼 처리하십시오.
"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.
도움이 되었기를 바랍니다.
그런데 포인터는 배열과 어떻게 다릅니까?무슨 문제 있어?
char *Array = (char*)CreateFileMapping(...);
을 치료할 수 있습니다. Array
지금부터 배열을 다루는 것과 비슷합니다.
C 스타일 캐스트를 사용할 수 있습니다.
char *p = (char*)CreateFileMapping(...);
p[123] = 'x';
또는 선호하는 재해석 캐스트:
char *p std::reinterpret_cast<char*>(CreateFileMapping(...));
p[123] = 'x';
나는 또한이 답변을 찾고있었습니다.당신이 해야 할 일은 자신만의 배열 유형을 만드는 것입니다.
static const int TickerSize = 1000000;
int TickerCount;
typedef char TickerVectorDef[TickerSize];
포인터를 이 새로운 유형으로 캐스팅할 수도 있습니다.그렇지 않으면 "컴파일러 오류 C2440"이 발생합니다.하지만 고정된 크기의 배열이어야 합니다.포인터로만 사용하는 경우 실제 메모리가 할당되지 않습니다(포인터 자체에 대한 4-8바이트 제외).