C언어 포인터

박영욱·2023년 8월 22일
1

c언어에서 포인터는 다른 변수의 메모리 주소를 저장하는 주소 저장용 변수입니다. &포인터 연산자는 변수명 앞에 붙을 경우 메모리 주소를 의미하고, *기호는 포인터 연산자 입니다.

라고 설명을 하는게 책이나 유튜브에서는 대부분입니다. 포인터 부분에서 어려움을 많이 느끼고 저 또한 많이 어려웠던 경험을 갖고 있습니다. 제가 이해한 부분 안에서 최대한 작성을 해보겠습니다!

c언어를 배워보았으면 지금까지는 변수를 사용하여 메모리에 데이터를 저장하거나 읽었습니다. 이렇게 c언어 소스 코드에서 사용한 변수들은컴파일 작업 후 기계어로 변경되면 모두 메모리 주소로 바뀌어서 적용이 됩니다.

직접 주소 지정 방식

앞서 말씀드린 것과 같이 직접 주소 지정 방식은 메모리를 사용할 때 프로그래머가 사용할 메모리 주소를 직접 적는 방식입니다. 예를 들어서 '102번지에 1042라는 값을 2바이트 크기로 저장하겠다' 라고 이야기한는 것이 직접 주소 지정 방식입니다. 이 방식은 이해가 쉬울 거라 믿습니다. 하지만 이렇게 직접 주소 지정 방식을 이용하면 한계점이 있습니다. 왜냐하면 함수 안에 선언한 변수는 해당 함수에서만 사용할 수 있고, 다른 함수에 선언한 변수가 메모리에 존재해도 문법적으로 접근을 할 수가 없기 때문입니다.

위의 코드는 main,Test 함수로 구성되어 있고 main 함수가 Test함수를 호출하는 구조로 되어 있습니다. 12행에서 Test함수가 호출되면 main함수의 tips변수와 Test함수의 soft변수가 메모리에 위치합니다. 하지만 Test함수의 6행에서 tips변수를 사용하려면 오류가 납니다. 각 함수의 지역 변수는 해당 함수 안에서만 사용 가능하기 때문입니다. 즉 tips 변수는 main함수에서만 사용할 수 있고 soft변수는 Test함수에서만 사용할 수 있습니다. 이렇게 c언어의 직접 주소 지정 방식은 변수 개념을 사용하기 때문에 문법 구조상 서로 다른 함수에 존재하는 변수를 참조할 수 없습니다. 만약 위의 소스코드에서 메모리 주소를 사용하여 수정하면 main함수에 선언한 tips변수의 값을 Test함수의 soft변수에 오류 없이 대입할 수 있습니다.

간접 주소 지정 방식

간접 주소 지정 방식은 직접 주소 지정 방식에 비해 이해해야하는 부분이 있습니다. 예시로 a라는 친구가 b라는 친구에게 종이에 글씨를 적어서 바로 전달 할 수도 있지만, 다른 방식으로 a친구가 종이를 사물함을 이용하여서 종이를 넣고 b친구가 사물함을 이용하는 방법이 있습니다. 이러한 예시를 간접 주소 지정 방식이라고 할 수 있습니다. 사물함이라는 매개체를 이용해서 주소를 간접적으로 명시하는 것 입니다. 종이에 적은 주소는 한 번 전달되면 바꿀 수 없지만 사물함에 들어 있는 주소는 사물함을 열어 보기 전가지는 다른 주소로 바꿀 수 있습니다.

본격적으로 포인터의 개념을 살펴보면, 포인터 문법을 사용해 선언한 포인터 변수는 메모리 주소만을 저장하기 위해 탄생한 특별한 변수입니다. 위에서 사물함에 비유했던 메모리가 c언어에서는 포인터 변수입니다. 즉 자신이 사용하고 싶은 메모리의 '주소'를 저장하고 있는 메모리가 포인터 입니다. 포인터 변수는 일반 변수와 다르게 *기호를 추가로 사용하여 다음과 같이 선언합니다.

ex) short <-자료형 *<- 포인터 ptr<-(포인터 변수 이름)

ptr은 포인터 변수의 이름이고 이 변수가 포인터라는 것을 번역기에게 알려주기 위해 ptr앞에 를 사용하였습니다. 그리고 자료형을 적는 위치에 short를 사용하였습니다. 여기서 prt의 자료형이 short이므로 2바이트라고 생각하는 사람이 많지만, 아닙니다! 일 반변수는 자료형이 `변수의 크기를 의미하지만, 포인터 변수는 자료형을 선언하지 않아도 무조건 크기가 4바이트로 정해져 있기 때문에 포인터 변수의 크기를 적을 필요가 없습니다. 그러면 앞의 자료형은 무엇이냐면 다음 그림과 같습니다.

즉 short는 ptr변수에 저장된 주소에 저장될 값의 자료형을 의미합니다. 앞에서 간접 주소지정 방식을 설명하면서 사용한 메모리 그림에 포인터 변수 ptr를 적용하면 다음과 같습니다.

간략하게 다시 표현하면

변수가 저장된 메모리 공간의 주소 얻기

프로그램은 실행될 때마다 사용할 메모리 공간의 주소가 달라집니다. 따라서 프로그램에 선언된 변수의 주소는 프로그램이 실행될 때마다 다른 주소에 할당이 됩니다. 예를 들어서 a변수가 지금 100번지에 할당되어 있어도 다음번 실행할 때는 200번지에 할당이 될 수 도 있습니다. 따라서 '포인터가 가리키는 대상'의 주소를 직접입력하여 항상 같은 주소를 사용하게 하면 대부분 오류가 발생하게 됩니다. 그래서 주소를 직접 입력하는 것보다 프로그램 안에 선언한 다른 변수의 주소를 받아와서 사용하는 것이 안전합니다. 변수는 해당 프로그램의 메모리영역에 만들어지기 때문에 다른 프로그램의 메모리 영역에 잘못 접근할 일이 없습니다. 변수의 주소는 &연산자를 사용하여 구할 수 있습니다.
ex) short birthday;
short *ptr //자신의 크기는 4바이트, 가리키는 대상의 크기는 short의 2바이트 포인터 변수임.
ptr=&birthday

아래 사진을 이해했으면 포인터는 이해했다고 할 수 있습니다.
매우중요!

0개의 댓글

관련 채용 정보