포인터 + 1이 4를 추가하는 이유
#include<stdio.h>
int main(void){
int *ptr,a,b;
a = ptr;
b = ptr + 1;
printf("the vale of a,b is %x and %x respectively",a,b);
int c,d;
c = 0xff;
d = c + 1;
printf("the value of c d are %x and %x respectively",c,d);
return 0;
}
산출값은.
the vale of a,b is 57550c90 and 57550c94 respectively
the value of c d are ff and 100 respectively%
ptr + 1로 밝혀졌는데, 왜 이런 식으로 행동하는 거지?
포인터가 배열과 호환되도록 설계되었기 때문에:
*(pointer + offset)
와 동치입니다.
pointer[offset]
포인터 산술은 바이트 단위가 아니라sizeof(pointer base type)- bytes 크기의 블록.
포인터가 무엇인지 생각해 보십시오.메모리 주소입니다.메모리의 모든 바이트에는 주소가 있습니다.그래서, 만약 여러분들이.int그것은 4바이트이고 그것의 주소는 1000이고 1001은 실제로 그것의 두번째 바이트입니다.int그리고 1002는 세번째 바이트이고 1003은 네번째 바이트입니다.크기 이후로.int컴파일러마다 다를 수 있습니다. 포인터를 증가시킬 때 당신이 어떤 중간 지점의 주소를 얻을 수 없는 것이 필수적입니다.int. 따라서 데이터 유형에 따라 건너뛸 바이트 수를 파악하는 작업이 대신 처리되므로 어떤 값을 얻더라도 상관없이 사용할 수 있습니다.
Basile Starynkvitch가 지적한 바와 같이, 이 금액은 다음과 같이 결정될 것입니다.sizeof데이터 멤버가 가리키는 속성입니다.주소는 순차적이지만 개체의 포인터는 해당 개체를 수용하는 데 필요한 실제 메모리 공간을 고려해야 한다는 사실을 잊기 쉽습니다.
포인터 산술은 까다로운 과목입니다.포인터 추가는 다음으로 뾰족한 요소를 전달하는 것을 의미합니다.따라서 주소는 다음과 같이 증가합니다.sizeof뾰족한 원소
단답형
포인터의 주소는 다음과 같이 증가합니다.sizeof(T)어디에T가 가리키는 유형입니다.그래서.int, 포인터는 다음과 같이 증가합니다.sizeof(int).
왜요?
무엇보다도, 표준은 그것을 요구합니다.이 동작이 (C와의 호환성을 제외하고) 유용한 이유는 배열 또는 A와 같은 연속 메모리를 사용하는 데이터 구조를 가지고 있을 때입니다.std::vector, 포인터에 하나를 추가하기만 하면 배열의 다음 항목으로 이동할 수 있습니다.컨테이너의 n번째 항목으로 이동하려면 그냥 추가하면 됩니다.
글을 쓸수있는것firstAddress + 2보다 훨씬 간단합니다.firstAddress + (sizeof(T) * 2), 그리고 개발자들이 가정하여 발생하는 버그를 방지하는 데 도움을 줍니다.sizeof(int)4(아닌지도 모른다)이고 코드를 쓰는 것과 같은.firstAddress + (4 * 2).
사실, 당신이 말할 때.myArray[4], 자네 말은myArray + 4첫첫 포인트 이것이 배열 인덱스가 0에서 시작하는 이유입니다. 첫 번째 요소(즉, myArray는 배열의 첫 번째 요소를 가리키는 포인트)를 얻기 위해 0을 더하고 n을 얻으면 됩니다.
한 번에 한 바이트씩 옮기려면 어떻게 해야 합니까?
sizeof(char)크기가 1바이트로 보장되므로 사용할 수 있습니다.char*한 번에 한 바이트씩 이동하고 싶다면요.
포인터는 개체가 할당된 메모리 표시의 특정 바이트를 가리킬 때 사용됩니다(기술적으로는 아무 곳이나 가리킬 수 있지만 그렇게 사용됩니다).포인터 산술을 수행하면 가리키는 개체의 크기에 따라 연산이 수행됩니다.당신의 경우, 각각 4바이트의 크기를 가진 정수를 가리키는 포인터입니다.
포인터를 생각해 보겠습니다.p이. . . .p+n는 것과 같은.(unsigned char *)p + n * sizeof *p(왜냐하면)sizeof(unsigned char) == 1)을 사용해 보십시오.
#include <stdio.h>
#define N 3
int
main(void)
{
int i;
int *p = &i;
printf("%p\n", (void *)p);
printf("%p\n", (void *)(p + N));
printf("%p\n", (void *)((unsigned char *)p + N * sizeof *p));
return 0;
}
언급URL : https://stackoverflow.com/questions/11598361/why-a-pointer-1-add-4-actually
'programing' 카테고리의 다른 글
| CSS 이전 또는 이후의 SVG 채우기 색상 변경 (0) | 2023.10.26 |
|---|---|
| ggplot2를 사용할 때 지속적으로 잘못된 그래픽 상태 오류가 발생함 (0) | 2023.10.26 |
| jQuery.jax()에서 반환된 데이터를 필터링하려면 어떻게 해야 합니까? (0) | 2023.10.26 |
| 예외 가져오기 "IlgalStateException:SaveInstanceState 이후에는 이 작업을 수행할 수 없습니다." (0) | 2023.10.26 |
| 게시 시 Wordpress 게시 상태 수정 (0) | 2023.10.26 |