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
출처 : 코딩도장
'업무 > C언어 등 IT 상식' 카테고리의 다른 글
[표준 라이브러리 함수] stderr, stdin, stdout, fprintf fflush (0) | 2017.12.01 |
---|---|
메모리 접근은 바이트 단위로 한다. (0) | 2017.11.29 |
게이트웨이 vs 라우터 (0) | 2017.11.29 |
포인터의 사이즈 (0) | 2017.11.28 |
(void *) 형변환 (0) | 2017.11.23 |