만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-viii. C언어 함수, 포인터

hanjinee 2020. 12. 31. 00:38

안녕하세요 제타지니입니다. 이번 포스트에서는 C언어의 함수와 포인터에 대해서 다루어 보겠습니다. 

 

C언어는 '함수' 중심의 언어입니다. 전에도 말씀드렸다 시피, 아두이노 스케치의 경우 C스타일로 프로그램을 작성한다고 했지요.

아두이노 스케치의 경우 setup과 loop 함수 두 부분으로 이루어져 있다고 하였는데요, 일반적으로 사용자 정의 함수를 만들고(선언, 정의), setup 함수나 loop함수 내에서 사용자 정의 함수를 호출합니다. 

 

자자, 그럼 아두이노에서 사용하는 함수는 우리가 일반 '수학'에서 말하는 함수와 다른 것일까요? 아니요. 같은 의미에서의 함수입니다. 

수학에서는 입력 값으로 '정의역'이라는 단어를 쓰지요. 

출력 값에 대해서는 '공역'이라고 하지요? 

C 언어에서는 단순히 정의역 = 입력,. 공역 = 출력이라고 생각하시면 됩니다. 정의역에 대해서, 그러니까 입력값에 대해서 '매개변수'로 표현되고 공역, 즉 출력에 대해서는 '반환값'으로 표현됩니다. C언어에서는 주어진 입력에 대해서 어떤 연산을 수행하고 하나의 출력을 냅니다. C언어에서는 0개 이상의 매개변수를 가질 수 있으며, 1개 이하의 반환값을 가질 수 있습니다. 

 

 

'함수'하면 꼭 알아야 하는 명령어로는 'return'과 'void'가 있습니다.

return ==> 함수 내에서 호출한 곳으로 결과를 알려 주기 위해서 사용하는 명령어

void ==> 매개변수가 없는 경우 or 반환값이 없는 경우

 

C언어에서 함수의 사용은 위에서 말씀드린 대로, '선언', '정의', '호출' 세 부분으로 구성됩니다. 

C언어에서는 함수의 정의나 선언 중 하나고 호출 전에 무조건 나와야 합니다만,

아두이노 스케치의 경우 정의나 선언이 호출 이전에 나와도 오류가 발생하지 않는다는 차이점을 지닙니다! 

 

위에서 설명 하였듯 함수는 한개 이하의 반환값을 가지지만, 만약 좌표 같은 경우의 두 개의 반환값이 필요하다면 어떻게 할까요?

그러한 경우 '포인터 변수'를 이용하면 간접적인 방법으로 두 개 이상의 반환값을 얻을 수 있습니다! 

 

[포인터]

결론부터 말씀드리자면, 포인터 어떤 값이 저장되는 위치를 가리키는 '메모리의 주소(address)'를 가리킵니다. 

아시다시피 변수 '위치'와 '값'으로 이루어 지지요? (C/C++언어에서 사용하는 변수의 값은 메모리의 특정 위치에 저장되고, 변수 선언은 변수의 값을 저장할 메모리 공간을 시스템에 요구하고 할당받는 과정이기 때문이지요.)  

 

아두이노에서 주소값(= 메모리의 위치, 번지)은 2byte로 표현되는 숫자입니다. 기억하기 쉽지 않죠? 그러니 기억하기 쉬운 '변수 이름'을 대신 사용 합니다. 즉, 변수 이름은 메모리 위치의 다른 이름인 셈이지요. 

 

포인터에서 기본적으로 기억할 연산자는 &입니다. ('&' =  번지 연산자, 주소값을 불러옴)

 

예시를 보실까요 

 

char a;

char *b;   // 포인터 변수는 2byte 필요(주소 자체가 2byte를 필요로 하기 때문)

 

a = 'A'; //char 형 변수 문자가 저장

b = &a; //char 포인터 형 변수에는 메모리 주소가 저장

 

*****포인터 자료에 자료형을 표현하는 이유는 명시한 주소에 들어있는 내용을 해석하기 위함입니다. 즉, 해당 주소값을 가리키는 곳의 크기를 결정니다. 

 

*****변수가 저장된 메모리 주소를 얻어오기 위해 '&'를 사용한 것과 반대로, 주소에 저장된 값을 얻어오기 위해서는 '*'를 사용합니다

 

728x90