안녕하세요 Stimpack 입니다.!
#include <stdio.h>
void num(short pack) //매개변수로 pack = stim
{
pack = 2 ; // pack = 2로 생각으로는 stim에 2가 대입될것으로 생각
}
void main()
{
short stim = 4;
num(stim); //num 함수 호출 매개변수로 stim 전달
printf("%d",stim) ; // stim은 4가 아닌 3이 출력!
}
위에 간단한 예제를 만들어 봤습니다.
c언어에서는 메모리를 직접 주소를 지정하거나 간접적으로 지정할수 있습니다.
직접적으로 주소를 지정하는 방식은 우리가 흔히 만드는 변수를 정의하는 방법입니다.
예를 들어 short stim= 4 라고 stim 변수를 초기화 했다면,
(signed)short 크기의(2byte = 16bits) 자료형에 변수 stim이라는 이름의 공간입니다.
우리는 이 공간 속에 2byte 즉 -32,768 ~ 32,767 값을 넣을수가 있습니다. (표현범위입니다..저는 저 값들이 다 들어가는줄 알았네요..)
즉 직접적으로 해당 변수 이름을 주면 언제든 그 주소를 호출할수 있습니다.
하지만 함수 범위내에 있는 변수만 사용할수 있고 다른 함수는 호출할수 없습니다. (2번)
(지역변수이기 때문...)
#include <stdio.h> //2번
void num(short pack) //매개변수로 pack = stim
{
printf("%d", pack); //4 출력 값은 잘 전달받음 .
pack = 2; // pack = 2로 생각으로는 stim에 2가 대입될것으로 생각
printf("%d", pack); // 2 출력 재 초기화 완료!
}
void main()
{
short stim = 4;
num(stim); //num 함수 호출 stim 값 전달( main함수를 호출자 , num을 피호출자라고한다.)
printf("%d", stim); // stim은 2가 아닌 4출력! num 함수에서 값 전달이 안된것을 확인.
}
이러한 문제에 대해 해결하기 위한 방법은 바로! 포인터를 사용하는 것 입니다.
포인터란 하나의 변수를 그 변수가 대신 원하는 다른 변수의 주소의 값을 저장시키는 것 입니다.
즉 다른 변수(메모리)의 주소값을 저장하는 문법입니다.
가리키는 대상의 자료형을 앞에 적고 다른 변수와 구분하기 위해 * 를 사용해주고 포인터 변수 이름을 적으면 됩니다.
short * stimpack short의 자료형 가진 변수를 가리키는 stimpack 이라는 포인터 변수를 만들었습니다.
( 보통 포인터 약자인 ptr이라고 많이 씁니다.)
#include <stdio.h> //3번
void num(short *stimpack) //short의 크기의 자료형을 가진 변수를 *stimpack이라는 포인터변수에 주소값을 저장하겠다.
//short *stimpack = &stim
{
*stimpack = 1; //포인터 변수가 가리키는 주소의 값을 1로 바꾸겠다라는 뜻입니다.
}
void main()
{
short stim = 4;
num(&stim); //num 함수 호출 stim 주소 값 전달(값이 아닌 stim의 주소값을 전달하겠다는 뜻.)
printf("%d", stim); // stim은 4가 아닌 1출력! 간접적으로 주소를 통한 값 변경이기 때문.
}
값이 잘 전달된 것을 확인할수 있습니다.
포인터는 변수이고,(32bits 운영체제라면 주소값이 4byte이기 때문에 기본적으로 포인터변수 크기는 4byte)
변수이기 때문에 안에 값을 넣을수 있는데 주소값을 넣습니다.
*stimpack 이라고 선언하면 stimpack 포인터 변수가 가리키는 변수의 값을 바꾸겠다.! 의미입니다.
만약 stimpack 으로 선언하면 변수이기 때문에 포인터 변수가 가리키고 있는 주소의 값을 바꾸겠다는 뜻입니다.
* stimpack과 stimpack은 다른 용도로 쓰입니다.
'C_Language' 카테고리의 다른 글
메모리 할당 (0) | 2020.02.04 |
---|---|
stimpack C언어 시작하기 (0) | 2018.11.22 |