문제

몇 가지 포인터가 있다고 가정 해 봅시다.

char * pChar;
int * pInt;

나는 그들이 단순히 다른 위치를 가리키는 메모리 주소를 보유하고 있으며, 유형은 특정 포인터에 의해 메모리 위치가 얼마나 큰지를 선언한다는 것을 알고 있습니다. 예를 들어, 숯은 시스템에서 바이트 크기 일 수 있고 int는 4 바이트 일 수 있습니다.

pChar++; // I am actually incrementing the address pointed to by pChar by 1 byte;
pInt++; // I am actually incrementing the address pointed to by pInt by 4 bytes;

그러나 내가 이것을한다면 어떻게해야합니까?

pChar+2; // increment the address pointed to by pChar by 2 bytes?
pInt+2; // increment the address pointed to by pInt by 2 bytes? what happens to the other two bytes?

감사합니다 .. 여기서 설명에 감사드립니다 .. ++ 작업을위한 포인터 유형입니까?

편집 : AVP는 내 질문에 적합하게 대답했지만 후속 질문이 있습니다.

memcpy(pChar,pInt,2);

2 바이트를 복사합니까? 또는 4 바이트? 액세스 위반이 있습니까?

Ryan Fox에 따르면 편집 : 답은 2 바이트입니다. 감사! 닫은!

편집 : 미래의 검색자가 이것을 찾을 수 있도록 .. 내가 발견 한 또 다른 정보 ..

memcpy(pChar+5,pInt+5,2);

PCHAR+5BYTELOCATIONS에 PINT+5BYTELOCATIONS에 의해 지적 된 메모리 블록의 2 바이트를 복사하지 않습니다. 2 바이트가 PCHAR+5BYTELOCATIONS에서 복사 한 것입니다. 나는 내가 읽지 말아야 할 곳을 읽으려고 노력했다. .. :)

도움이 되었습니까?

해결책

"++"은 x = x+1의 또 다른 이름입니다.

포인터의 경우 1 또는 N으로 증가하더라도 중요하지 않습니다. 어쨌든 크기 (유형)*n이 사용됩니다. 1의 경우 단지 크기 (유형)입니다.

따라서 2로 증가하면 (두 번째 케이스) :
char의 경우 2*sizeof (char) = 2*1 = 2 바이트,
int의 경우 2*sizeof (int) = 2*4 = 8 바이트가됩니다.

다른 팁

아, 이제 이해합니다. 당신은 질문 했어야합니다 - "유형을 가진 포인터의 요점은 무엇입니까?"

실제로 두 가지 점이 있습니다.

  • 포인터 산술;
  • Dereferencing (포인터가 가리키는 주소에 저장된 값을 되 찾는).

포인터의 유형을 모르면 둘 다 불가능합니다.

추가 : Memcpy의 문서를 읽으십시오. Memcpy는 포인터의 유형이 무엇인지 모르기 때문에 마지막 인수는 바이트 수입니다. 그것에 대한 두 주장은 모두 무효 포인터입니다.

추가 2 : 액세스 위반 - 이에 따라 다릅니다. 이 포인터에 할당 된 메모리 밖으로 나가지 않으면 액세스 위반이 없습니다. 복사 작업은 모든 것을 바이트 바이트로 복사하며 기대하는 것처럼 결과를 얻을 수 있습니다 (의미가 없을 수도 있지만).

할당 된 메모리 바운드 밖으로 나가면 ~할 것 같다 액세스 위반을 받으십시오. 그러나 다른 변수에 할당 된 메모리로 넘어갈 수도 있습니다. 프로그램이 실행될 때 어디에 있는지 알리는 것은 거의 불가능 하므로이 작업을 수행하면 예측할 수없는 결과가 발생할 수 있습니다.


포인터에는 세 가지 주요 장점이 있습니다.

  1. "참조로"인수를 전달할 수 있습니다. 이것은 C ++와 같은 실제 참조가 없었던 C에서 더 많은 문제 였지만 외부 라이브러리와 협력해야 할 때와 같은 많은 경우에도 여전히 유용합니다. 또한 참조별로 통과하는 것은 기능을 전달하는 변수를 수정하기를 원할 때 유용 할뿐만 아니라 유용합니다. 또한 큰 데이터 구조를 매개 변수로 전달하는 데 매우 좋습니다.
  2. 트리, 링크 된 목록 등과 같은 모든 종류의 멋진 동적 데이터 구조를 구축하려면 포인터 없이는 불가능합니다.
  3. 필요에 따라 더 큰/작은 제품으로 배열을 다시 할 수 있습니다.

추신 : 문제는 포인터가 예를 들어 산술을 사용하는 이유에 관한 것이 었습니다.

포인터 산술은 정확히 그렇게 작동하지 않습니다. 첫 번째 예는 정확하고 두 번째 예는 그리 많지 않습니다.

pChar+2; // increment the address pointed to by pChar by 2 bytes
pInt+2; // increment the address pointed to by pInt by 8 bytes

이 부분을 위해 :

memcpy (PCHAR+5, 파인트+5,2);

먼저, "+"는 typecast를 평가합니다.

바이트로 :

PCHAR 5 "5"는 5 바이트이며
PINT+5 HERE "5"는 5 int이므로 5 * 4 = 20 바이트입니다.
그런 다음 모든 것이 무효로 캐스트되고 두 바이트가 복사됩니다.

"5"대신 여기서와 같이 카운터를 사용합니다.

for (int i = 0; i<100; i++)
    memcpy(pChar+i, pInt+i, 2);

그런 다음 PCHA의 경우 다음 사본 명령으로 복사 한 바이트 (두 번째)를 덮어 씁니다. 그리고 파인트의 경우 각 단계 (int 배열에 대해서는 괜찮습니다).

나는 포인터 유형이 C ++ vtable 오프셋을 설명하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top