포인터 감산 혼란
다른 포인터에서 포인터를 빼는 경우 차이는 바이트의 수와 동일하지 않지만 (정수를 가리키는 경우) 몇 개의 정수와는 동일합니다.왜 그럴까?
그 아이디어는 당신이 메모리 블록을 가리키고 있다는 것입니다.
+----+----+----+----+----+----+
| 06 | 07 | 08 | 09 | 10 | 11 | mem
+----+----+----+----+----+----+
| 18 | 24 | 17 | 53 | -7 | 14 | data
+----+----+----+----+----+----+
가지고 계신 경우int* p = &(array[5])
그리고나서*p
14살이 됩니다.가는 중p=p-3
만들 것이다*p
열일곱 살이다.
그래서 만약에int* p = &(array[5])
그리고.int *q = &(array[3])
,그리고나서p-q
포인터가 2블록 떨어져 있는 메모리를 가리키기 때문에 2가 되어야 합니다.
원시 메모리(어레이, 리스트, 지도 등)를 취급할 때는, 박스를 많이 그립니다!정말 도움이 돼요!
포인터 랜드의 모든 것은 오프셋에 관한 것이기 때문입니다.당신이 말할 때:
int array[10];
array[7] = 42;
두 번째 줄에서 실제로 말하는 내용은 다음과 같습니다.
*( &array[0] + 7 ) = 42;
문자 그대로 번역하면:
* = "what's at"
(
& = "the address of"
array[0] = "the first slot in array"
plus 7
)
set that thing to 42
그리고 7을 더해서 적절한 위치에 오프셋 포인트를 만들 수 있다면, 우리는 그 반대가 있어야 합니다. 그렇지 않으면 수학에 대칭이 없습니다.다음 경우:
&array[0] + 7 == &array[7]
그 후, 온전성과 대칭성에 대해서는, 다음과 같이 합니다.
&array[7] - &array[0] == 7
따라서 정수의 길이가 다른 플랫폼에서도 답은 동일합니다.
10개의 정수가 배열되어 있다고 가정합니다.
int intArray[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
그런 다음 intArray로 포인터를 이동합니다.
int *p = intArray;
그 후, 증량합니다.p
:
p++;
예상대로라면요, 왜냐하면p
로부터 시작하다intArray[0]
는 의 증분값입니다.p
되려고intArray[1]
그래서 포인터 산술이 그렇게 되는 거죠.여기 코드를 보세요.
"두 개의 포인터를 빼면, 그것들이 같은 배열을 가리키고 있는 한, 그 결과는 그것들을 분리하는 요소의 수입니다."
자세한 것은 이쪽을 참조해 주세요.
이러한 포인터 감산 동작은 포인터 추가 동작과 일치합니다.즉,p1 + (p2 - p1) == p2
(어디서)p1
그리고.p2
같은 배열에 대한 포인터입니다).
포인터 추가(포인터에 정수 추가)는 다음과 같이 동작합니다.p1 + 1
는 배열 내의 다음 바이트가 아니라 배열 내의 다음 항목의 주소를 제공합니다.이것은 매우 쓸모없고 안전하지 않은 작업입니다.
이 언어는 포인터가 정수와 같은 방식으로 추가 및 감산되도록 설계될 수 있지만, 이는 포인터 산수를 다르게 쓰고 가리키는 유형의 크기를 고려해야 한다는 것을 의미합니다.
p2 = p1 + n * sizeof(*p1)
대신p2 = p1 + n
n = (p2 - p1) / sizeof(*p1)
대신n = p2 - p1
그 결과 코드는 더 길고 읽기 어려우며 실수를 저지르기 쉬워집니다.
특정 유형의 포인터에 산술 연산을 적용할 때는 항상 결과 포인터가 원래 시작점에 상대적인 "유효한" 메모리 주소(올바른 단계 크기를 의미)를 가리키도록 해야 합니다.이는 기본 아키텍처와는 독립적으로 메모리 내의 데이터에 액세스하는 매우 편리한 방법입니다.
다른 "스텝 크기"를 사용하려면 언제든지 원하는 유형으로 포인터를 던질 수 있습니다.
int a = 5;
int* pointer_int = &a;
double* pointer_double = (double*)pointer_int; /* totally useless in that case, but it works */
@fahad 포인터 산술은 포인터가 가리키는 데이터 유형의 크기에 따라 달라집니다.따라서 포인터가 int 유형일 경우 int(4바이트) 크기의 포인터 산술이 필요합니다.마찬가지로 char 포인터의 경우 포인터의 모든 조작은 1바이트가 됩니다.
언급URL : https://stackoverflow.com/questions/3238482/pointer-subtraction-confusion
'sourcecode' 카테고리의 다른 글
Vue.js img src 변수와 텍스트 연결 (0) | 2022.08.09 |
---|---|
OpenCV(Hough 변환 또는 기타 기능에 기반)를 사용한 견고한(색상과 크기 불변) 원 검출 쓰기 (0) | 2022.08.09 |
루트를 다른 파일로 분할 (0) | 2022.08.08 |
vue 2에서 클릭 핸들의 하위 항목 전파 사용 안 함 (0) | 2022.08.08 |
vuex 계산 속성이 무효가 아님 (0) | 2022.08.08 |