duddnd904   5년 전

#include

int main()
{
char *ptr1 = 50;
short *ptr2 = 50;
int *ptr3 = 50;
double *ptr4 = 50;


}

다양한 포인터 타입의 포인터변수들에게 각각 1을 더해줬을 때 주소값의 변화를 보고있었습니다.

처음 제 생각은 변하는 값은 주소가 지칭하는 실제 정수값이 

변하기 때문에 주소값은 아무 변화가 없다였습니다.

하지만

*ptr1++; *ptr2++; *ptr3++; *ptr4++

이런식으로 코드를 넣고 확인해보니 각각의 주소값에도 포인터타입에 따라서 다른 값이 더해져 있었습니다.

제가 어떤 부분에서 이해가 잘못되었는지 알고싶습니다. 감사합니다.

djm03178   5년 전

  1. *ptr1++; 이라는 문장에서 *은 아무런 의미가 없습니다. 연산자 결합 순서에 따라 *ptr1++ 은 *(ptr1++) 로 해석되고, 이는 ptr1이 가리키는 주소를 증가시킨 뒤 그 주소에 있는 값을 얻어온다는 뜻인데 얻어온 값을 아무 곳에도 사용하지 않으니 *은 무의미합니다. 그냥 ptr1++; 이라고 쓰는 것과 동일합니다.
  2. "주소가 지칭하는 실제 정수값"이라는 게 무슨 뜻인가요? 위 코드에서 대입한 50은 주소값으로 해석되고 네 개의 포인터 모두 50이라는 주소를 가리키고 있는 것입니다. 이 주소에 실제로 들어있는 값이 무엇인지는 전혀 알 수 없습니다. 포인터를 증가시키는 연산은 해당 주소에 들어있는 값은 건드리지 않고, 그 포인터가 다른 주소를 가리키게 만든다는 의미입니다.
  3. 주소 자체는 정수형으로 표현이 가능하기는 하지만, 둘은 별개로 봐야 합니다. 포인터를 1 증가시키는 연산은 해당 포인터가 어떤 자료형을 가리키는 포인터인지에 따라, 그 자료형의 크기만큼의 주소를 증가시킨다는 의미입니다. 그래서 int형의 포인터를 1 증가시키는 연산은 sizeof(int) = 4만큼의 주소를 증가시키며, double형의 포인터를 1 증가시키는 연산은 sizeof(double) = 8만큼의 주소를 증가시키게 됩니다.

duddnd904   5년 전

감사합니다 djm03178님

대략적인 맥락은 이해가 됐는데 추가 질문이 생겼습니다.


제가 처음에 헷갈렸던 부분이 주소값은 자릿수가 긴 16진수로만 생각해서 그런 것 같습니다. 사용자가 임의의 정수로 주소값을 정의했다면 그에 따라 실질적인 메모리 번지에 상응하는 건가요?

djm03178   5년 전

엄밀하게 말하면 그 주소는 가상 주소이기 때문에 물리 메모리 상에 실존하는 위치를 나타낼 수도 있고 아닐 수도 있지만 이는 프로세스에 할당된 페이지 테이블에 달렸습니다. 확실한 건, 그런 식으로 임의의 주소값을 포인터에 대입해서 쓸 일은 아예 없다고 보시면 됩니다.

duddnd904   5년 전

덕분에 막히던 부분이 뚫린기분입니다 감사합니다!!
프로그래밍 처음 접하실때 어떻게 공부하셨나요??

djm03178   5년 전

처음 접한 건 초등학교 6학년 때라 잘 기억나지는 않지만, C언어 책 3권 정도 놓고 열심히 읽으면서 만들고 싶은 거 마음껏 만들었다고 기억합니다.

duddnd904   5년 전

ㅋㅋㅋ 저도 그럴게요 감사합니다 좋은밤 되세요

댓글을 작성하려면 로그인해야 합니다.