>

따라서 포인터 p가 있고 i와 j 값이 차례로 정의되어있는 경우 스택의 값이 차례로 나타납니다. 그러나 적어도 저에게는 그렇지 않습니다.

int i = 10;
int j = 20;
int *p = &i;
p++;
(*p) = 30;
std::cout << i << " " << j << " " << (*p) << "\n" ;

대신이 값을 인쇄합니다. 내가 10 20 30 를 언급하면  대신 (*p) = 30; 내부  빈 주소가됩니다.

이 경우 ++ 연산자는 *p 에서 내 참조를 변경할 것이라고 생각했습니다.   i 로  그리고 j   (*p) 의 가치를 바꿀 것입니다 하지만 분명히 그렇지 않습니다.

그래서 무슨 뜻인지 궁금 하신가요?

j
  • 답변 # 1

    코드의 동작은정의되지 않음입니다.

    포인터 산술은 배열 내에서만 유효합니다. 다른 객체에 대한 포인터를 늘리고 해당 포인터를 역 참조하여 객체에 액세스 할 수 없습니다. 좀 더 자세하게, p++  가 정의되어 있지만 (객체를 단일 요소 배열로 간주 할 수 있으며 배열 끝을 지나서 포인터를 설정할 수 있음) 후속 역 참조는 정의되지 않습니다.

  • 답변 # 2

    I thought that the ++ operator in this case will change my reference from i to j and t....

    그건 틀렸어. 이 정의의 경우 :

    int i = 10;
    int j = 20;
    
    

    j 를 만들 규칙은 없다   i 에 인접한 메모리 위치에 저장 .

    게다가 포인터 (추상적 인 개념)와 포인터가 모델링 한 것 (실제 메모리 주소)을 혼동하지 마십시오. 대부분의 경우 포인터를 물리적 메모리의 주소로 생각하는 것이 좋지만 엄격하게 말하면 그렇지 않습니다.

    C ++ 표준은 포인터에 대한 특정 규칙과 사용자가 할 수있는 작업을 정의합니다. int 에 대한 포인터 증가  다른 int 에 대한 포인터를 얻으려면  바로 다음에 정의 된 규칙은 그러한 규칙 중 하나가 아닙니다! 하드웨어 메모리에 두 개의 정수가 인접한 메모리에 저장 되어도 i 에 대한 포인터가 증가한다는 점에 유의하십시오.  그리고 그것을 역 참조하는 것은 정의되지 않은 행동입니다.

  • 답변 # 3

    ++  연산자는 메모리에서 다음 변수가 아닌 다음 위치를 가리 킵니다.

    int i[2] = {10, 20}; 가 있다면  다음 p++   i[1] 를 가리킬 것입니다  즉, 20

  • 답변 # 4

    인접한 메모리 위치를 원한다면 배열을 선언해야합니다. 데이터 유형이 작기 때문에 libc가 위치를 할당합니다. 포인터는 선언 된 변수 주위의 공간을 차지합니다.

  • 이전 node.js - 많은 MondoDB 데이터베이스 접근 방식의 NodeJS 샤딩 아키텍처
  • 다음 wordpress - 프로그래밍 방식으로 모든 제품 카테고리를 모든 제품에 할당