1. 변수의 메모리 주소 구하기

int num1 = 10;


&num1 // 008A7FC, num1의 메모리 주소


2. 메모리 주소를 저장하기 (포인터변수 : 메모리 주소를 저장하는 변수)

구조 : 자료형 *포인터이름;

포인터 = &변수

 char *numPtr; //char형 공간을 가리키는 포인터

int num1 = 10;

numPtr = &num1;


&num1 의 값과 numPtr의 값이 같다. 


[Call by reference, Call by value]

3.메모리 주소가 있는 곳으로 이동해서 값을 가져오기 (역참조 연산자, dereference)


[역참조 연산자로 변수의 메모리 주소에 접근하여 값 가져오기]

구조 : *포인터

int *numPtr;

int num1 = 10;


numPtr = &num1;


*numPtr 은 10 //dereference 연산자로 num1의 메모리 주소에 접근하여 값을 가져옴.


[포인터 변수에 역참조 연산자를 사용한 뒤, 값을 할당하기]

int *numPtr;

int num1 = 10;


numPtr = &num1; 

*numPtr = 20;


*numPtr 값은 20, num1 값도 20


/********************자료형 맞춰주기******************************/

역참조 연산자로 자료형을 바꿀 수 있다.

int *numPtr; 에서 *numPtr처럼 역참조하면, pointer to int 에서 pointer to를 제거한 "int"가 된다. 

따라서 포인터 numPtr에 변수 num1값을 할당하고 싶다면, 역참조 연산자로 자료형을 맞추면 된다 


int *numPtr;

int num1 = 10;


numPtr = num1 //컴파일 warning. 자료형 불일치

: *numPtr = num1;//이렇게 하면 자료형 일치.


&로도 자료형을 맞출 수 있다.

int *numPtr;

int num1;


numPtr = &num1 이렇게 주소값을 가리키는 자료형으로 맞춰준다. //Pointer to int와 address of int는 자료형이 같다. 



4. 다중 포인터

int a = 10;

int *p1 ;

int **p2;


p1 = &a; //a의 주소값을 포인터 변수 p1에 저장.

p2 = &p1 // p1의 주소값(인 a의 주소값이 가리키고 있는 데이터를) 포인터 변수 p2에 저장


printf("%d", **p2 ); 를 출력하면 a의 값인 10이 출력됨.



이렇게 따로따로 선언이 되어있으면 하나씩 풀어가니까 헷갈리지 않은데 

int *p1 = &a;

int **p2 = &p1; 이렇게 선언되어있으면 괜히 당황스럽다.

다중포인터는 헷갈리므로 괄호를 사용하면서 괄호부터 처리하는게 안헷갈리고 좋다.

*(*p2) 이렇게.

1) *(*p2)는 p1의 주소값을 가지고 있다.

2) (*p2)는 p1이 가지고 있는 값을 의미한다.

3) *p1은 a의 주소값을 가지고 있다. 

4) 그러므로 (*p2)는 a의 주소값을 가리킨다.

5) *p1은 a의 주소값을 가지고 있으므로 *(*p2)는 a의 값이 된다. 


call by value를 통해 a의 값을 바꿀수 있다.

*(*p2) = 20; //p2를 이용해서 a가 가지고 있는 값을 20으로 바꾼 것임.

*(*p2) 는 a의 값이므로.




Call by value, Call by reference 참고 사이트 : 

http://11bike.blogspot.kr/2011/04/c-call-by-reference.html

출처 : 코딩도장

https://dojang.io/mod/page/view.php?id=276

+ Recent posts