int 포인터 '++'가 1이 아니라 4가 증가하는 이유는?
포인터 값은 변수의 주소입니다.왜 가치가 있는가?int pointer
인트 포인터가 1 증가된 후 4인치 증가하였다.
내 생각에 포인터(변수의 주소)의 값은 포인터 증분 후에 1바이트만 증가하는 것 같아.
테스트 코드:
int a = 1, *ptr;
ptr = &a;
printf("%p\n", ptr);
ptr++;
printf("%p\n", ptr);
예상 출력:
0xBF8D63B8
0xBF8D63B9
실제 출력:
0xBF8D63B8
0xBF8D63BC
편집:
다른 질문 - 4바이트 a를 방문하는 방법int
하나 둘씩 차지할까?
a를 증분할 때T*
, 그것은 움직인다.sizeof(T)
바이트.† 이것은 다른 값을 이동하는 것이 말이 되지 않기 때문이다: 만약 내가 a를 가리키고 있다면int
예를 들어, 4바이트 이하로 증가하면 나에게 남은 것은 무엇인가?부분적int
일부 다른 데이터와 혼합: 비논리적.
메모리에서 다음 사항을 고려하십시오.
[↓ ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
포인터를 늘리면 더 이해가 되는 건?다음 내용:
[↓ ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
또는 다음 중 하나를 선택하십시오.
[↓ ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
마지막은 실제로 어떤 종류의 것도 가리키지 않는다.int
. (기술적으로, 그 포인터를 사용하는 것은 UB이다.)
1바이트를 이동하려면 a를 증가시키십시오.char*
: 의 크기char
항상 하나:
int i = 0;
int* p = &i;
char* c = (char*)p;
char x = c[1]; // one byte into an int
③이것은 증분할 수 없다는 것이다.void*
왜냐하면void
불완전한 유형이다.
포인터는 포인터가 가리키는 유형의 크기로 증가한다. 포인터가 char를 가리킬 경우,pointer++
1234바이트 구조체를 가리키면 포인터가 1씩 증가한다.pointer++
포인터를 1234만큼 증가시킨다.
처음 만났을 때 헷갈릴 수도 있지만, 사실 말이 되긴 하지만, 이것은 특별한 프로세서 기능이 아니라 컴파일러가 컴파일 중에 계산하기 때문에, 당신이 글을 쓸 때pointer+1
컴파일러는 그것을 다음과 같이 편찬한다.pointer + sizeof(*pointer)
그 아이디어는 증분 후에 포인터가 기억 속의 다음 부분을 가리킨다는 것이다.ints 폭은 4바이트이므로 4바이트씩 증가한다.일반적으로 유형 T에 대한 포인터는 크기(T)에 따라 증가한다.
말씀하신 대로 anint pointer
을 가리키다int
안int
일반적으로 4바이트를 차지하므로 포인터를 증가시키면 "다음"을 가리킨다.int
메모리 - 즉, 4바이트 증가.그것은 어떤 크기의 유형에도 이런 식으로 작용한다.입력할 포인터가 있는 경우A
, 그런 다음 증분A*
에 의해 증가될 것이다.sizeof(A)
.
생각해 보십시오. 포인터를 1바이트만 증가시키면 포인터가 한 가운데를 가리킬 때보다int
이런 기회가 어디 있는지 생각나지 않아
예를 들어, 이 동작은 배열 위에 반복할 때 매우 편안하다.
포인터는 기억 속에 있는 무언가의 시작을 가리킨다.INT는 4바이트(32비트)를, Double은 8바이트(64비트)의 메모리를 점유한다.따라서 DUBLE 번호가 저장되어 있고 다음 사용 가능한 메모리 위치를 가리키는 매우 낮은 레벨에서 원하는 경우 포인터가 8바이트 증가될 수 있다.어떤 이유로 DUBLE 값을 시작할 때부터 +4바이트를 가리켰다면 DUBLE 값을 손상시킬 것이다.기억은 그 자체로 양심이 없는 아주 큰 평지장이기 때문에 그것을 적절히 나누고 그 분야에 위치한 항목의 '경계'를 존중하는 것은 소프트웨어에 달려 있다.
참조URL: https://stackoverflow.com/questions/5610298/why-does-int-pointer-increment-by-4-rather-than-1
'Programing' 카테고리의 다른 글
배포할 Android Jar 라이브러리 만들기 (0) | 2022.05.07 |
---|---|
Vue 또는 Axios 세션 쿠키 저장 안 함 (0) | 2022.05.07 |
기본적으로 모든 Java 애플리케이션이 사용할 수 있는 Java Keystore로 자체 서명된 인증서를 가져오는 방법 (0) | 2022.05.06 |
vuex 상태 + persistedState 플러그인에 토큰을 저장하는 것이 안전한가? (0) | 2022.05.06 |
Java에서 LinkedList over ArrayList를 사용하는 시기 (0) | 2022.05.06 |