특정 배열 요소를 얻으려면 배열에 대한 포인터를 변경하십시오.

StackOverflow https://stackoverflow.com/questions/107294

  •  01-07-2019
  •  | 
  •  

문제

나는 포인터와 참조의 전반적인 의미를 이해합니다(또는 적어도 나는 그렇게 생각합니다). 새로운 동적으로 메모리를 할당하고 있습니다.

내 질문은 다음과 같습니다.

내가 사용한다면 cout << &p, 그것은 "가상 메모리 위치"를 표시합니다 p.이 "가상 메모리 위치"를 조작할 수 있는 방법이 있나요?

예를 들어, 다음 코드는 다음의 배열을 보여줍니다. int에스.

그 가치를 보여주고 싶다면 p[1] 그리고 나는 "가상 메모리 위치"를 알고 있었습니다. p, 어떻게든 할 수 있을까 "&p + 1"라는 값을 구하고 p[1] ~와 함께 cout << *p, 이제 배열의 두 번째 요소를 가리킬까요?

int *p;
p = new int[3];

p[0] = 13;
p[1] = 54;
p[2] = 42;
도움이 되었습니까?

해결책

물론 포인터를 조작하여 배열의 다른 요소에 액세스할 수 있지만 포인터의 내용을 조작해야 합니다(예:포인터 자체의 주소가 아니라 p가 가리키는 주소)

int *p = new int[3];
p[0] = 13;
p[1] = 54;
p[2] = 42;

cout << *p << ' ' << *(p+1) << ' ' << *(p+2);

각 더하기(또는 빼기)는 배열의 후속(이전) 요소를 의미합니다.p가 4바이트 변수를 가리키는 경우(예: 정수 일반적인 32비트 PC에서) 주소가 12345라면 ​​p+1은 12346이 아닌 12349를 가리킵니다.p가 가리키는 항목에 액세스하기 위해 역참조하기 전에 p에 포함된 값을 변경하려고 합니다.

다른 팁

좀 빠지는. &p 주소입니다 포인터의 p. &p+1 다음 중 하나의 주소를 참조합니다. int* 더 나아가.당신이하고 싶은 일은

p=p+1; /* or ++p or p++ */

이제 당신이 할 때

cout << *p;

54를 얻게 됩니다.차이점은, p 포함 int 배열의 시작 주소, 하는 동안 &pp의 주소.하나의 항목을 이동하려면 해당 항목을 더 자세히 가리켜야 합니다. 정수 배열, 스택을 따라 더 이상 위치가 아닙니다. p 살고 있다.

너만 있었다면 &p 그런 다음 다음을 수행해야 합니다.

int **q = &p; /* q now points to p */
*q = *q+1;
cout << *p;

내가 착각하지 않았다면 그것도 54를 출력할 것이다.

포인터로 작업한 지 꽤 시간이 지났지만 p가 배열의 시작 부분을 가리키는 경우(예:p[0]) 그리고 이를 증가시켰습니다(예:p++) 그러면 p는 이제 p[1]을 가리키게 됩니다.

값을 얻으려면 p를 역참조해야 한다고 생각합니다.포인터 앞에 *를 넣어 포인터를 역참조합니다.

따라서 *p = 33이고 p[0]을 33으로 변경합니다.

두 번째 요소를 얻으려면 *(p+1) 을 사용하므로 필요한 구문은 다음과 같습니다.

cout << *(p+1)

또는

cout << *(++p)

나는 이것을 좋아한다:

&p[1]

제가 보기에는 더 깔끔해 보이네요.

C 및 C++의 "포인터 유형"을 매우 길고 논리적인 유형으로 생각하십시오. 셀의 행 바이트 0부터 시작하여 CPU 메모리 공간의 바이트에 중첩됩니다.각 셀의 너비(바이트)는 포인터의 "유형"에 따라 다릅니다.각 포인터 유형은 셀 너비가 다른 행을 배치합니다.ㅏ "int *" 포인터는 int의 저장 너비가 4바이트이므로 4바이트 셀의 행을 배치합니다.ㅏ "double *" 셀당 8바이트 행을 배치합니다.ㅏ "struct foo *" 포인터는 각 셀이 단일 너비만큼 행을 배치합니다. "struct foo", 그게 뭐든지.모든 "사물"의 "주소"는 "사물"이 포함된 행에 있는 셀의 0부터 시작하는 바이트 오프셋입니다.

포인터 연산은 바이트가 아닌 행의 셀을 기반으로 합니다. "*(p+10)"는 "p" 이후의 10번째 셀에 대한 참조입니다. 여기서 셀 크기는 p의 유형에 따라 결정됩니다."p" 유형이 "int"인 경우 "p+10"의 주소는 p보다 40바이트 뒤입니다.p가 1000바이트 길이의 구조체에 대한 포인터인 경우 "p+10"은 p를 지나 10,000바이트입니다.(컴파일러는 여러분이 생각하는 것보다 더 클 수 있는 구조체에 대한 최적의 크기를 선택합니다.이는 "패딩"과 "정렬" 때문입니다.논의된 1000바이트 구조체는 실제로 셀당 1024바이트를 차지할 수 있습니다. 예를 들어 "p+10"은 실제로 p보다 10,240바이트 앞선 것입니다.)

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