안녕하세요 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

+ Recent posts