특정 배열 요소를 얻으려면 배열에 대한 포인터를 변경하십시오.
문제
나는 포인터와 참조의 전반적인 의미를 이해합니다(또는 적어도 나는 그렇게 생각합니다). 새로운 동적으로 메모리를 할당하고 있습니다.
내 질문은 다음과 같습니다.
내가 사용한다면 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 배열의 시작 주소, 하는 동안 &p
은 p의 주소.하나의 항목을 이동하려면 해당 항목을 더 자세히 가리켜야 합니다. 정수 배열, 스택을 따라 더 이상 위치가 아닙니다. 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바이트 앞선 것입니다.)