안녕하세요 stimpack 입니다.!    


오늘은 포인터에 대해서 알아보는 시간을 갖도록 하겠습니다.! 


포인터를 배우기전 우리는 자료형과 변수를 선언함으로써 메모리에 데이터를 저장하거나 읽었습니다.! 


사용한 변수들은 컴파일을 통해 메모리 주소로 바뀌어서 사용되었습니다.


이렇게 주소를 저장하는 방식을 직접 주소 지정 방식이라고 합니다.!


사용자가 직접 변수를 선언함으로써 컴파일러에게 주소를 기억해! 라고 명령하는 것과 같습니다.


직접주소를 지정하는 방식에는 한계가 있습니다.


     


(메모리주소는 임의 주소입니다)

위에 소스를 보시면 빌드시 실패한 것을 알수 있습니다.  


error를 보시면 'pack': 선언되지 않은 식별자 입니다. 라고 나옵니다. 이것은 main함수에서만 선언되고 stimpack 함수에서는 선언되지 않았기에 


컴파일러가 main함수를 시작으로 stimpack 함수의 호출로 인해 컴파일시 pack라는 변수가 stimpack 함수안에서 선언되지 않았기에 에러를 


표출하게 됩니다.


즉 pack 변수는 main에서 선언된 지역변수이기 때문에 c언어 문법적으로 다른 지역간에 호출은 불가합니다.! '



물론 매개변수를 이용하여 함수를 호출한다면 main함수에서 선언한 pack변수를 사용하여 값을 변경할수 있습니다.


하지만 pack를 다시 초기화하려고 하면 지역변수이기 때문에 안됍니다..



이때 직접 주소 지정방식에 한계를 느끼게 됩니다 .! 


그래서 사용할수 있는 간접 주소 지정 방식 포인터를 사용하시면 됩니다. ! 


포인터란



예를 들어 우리는 목욕탕을 갔습니다. 주인은 38번 사물함 열쇠를 주고 우리는 38번열쇠를 보고 38번 사물함으로 이동합니다.


즉 여기서 포인터의 역할은 38번 열쇠와 같습니다.! 


우리가 직접적으로 38번 사물함을 가는 것은 좀전에 설명한 직접 주소 방식 (일반 변수) 와 같습니다. 


하지만 C언어 문법상 우리는 다른 함수에서 선언된 변수는 사용하지 못하는 문제가 있었습니다. 


하지만 간접적으로 사물함의 열쇠를 가지고 접근한다면 다른 함수내에서도 사용할수가 있게 됩니다.! 



이렇게 포인터를 사용하여 main함수에 있는 지역변수 pack를 stimpack 함수에서 값을 변경할수 있게 되었습니다.! 



메모리상 보시면 포인터 변수는 pack의 주소를 가르키기 때문에 stimpack 변수에서 포인터를 이용하여 값을 변경할수가 있게됩니다. 


(여기서 포인터 변수의 크기가 4byte 인 이유는 32bits 운영체제에서 사용하는 주소의 크기는 4byte 이기 때문에 기본적으로 가르키는 대상의 주소를 


저장하려면 4byte로 할당됩니다. )


포인터 문법은 


가르키는 대상의 자료형 * 포인터변수이름 으로 구성되어 있습니다. (ex short *ptr ;) 


예를 들어 


int stim =10 ;


int *ptr ;


ptr = &stim ; ( & 이 연산자는 해당 변수의 주소값을 나타내는 연산자 입니다. 즉 ptr 포인터 변수에 시작주소를 저장하겠다)


(이렇게 사용하고  위에 두줄은 int *ptr = &stim;  이렇게 줄여서 사용할수도 있습니다. )


여기서 포인터 변수는 두가지의 의미를 가질수 있습니다.


*ptr   ptr  


*ptr은 가르키는 대상의 값을 뜻합니다. 


ptr은 가르키는 대상의 변수의 값을 (시작주소) 바꾸겠다는 뜻입니다.


그래서 위에 ptr = &stim; 이라고 사용한게 시작주소를 stim의 주소로 저장한다는 뜻 입니다.





여기서 ptr = &stim 즉 ptr변수가 가르키는 시작주소는 stim의 주소 (0x0010001)을 포인터 변수에 저장한다는 뜻입니다.


*ptr은 가르키는 대상 즉 stim의 값을 변경한다는 뜻입니다. 



이렇게 포인터 변수를 이용하여 주소값을 바꿀수도 있고 가르키는 대상의 값도 바꿀수있습니다.!




+ Recent posts