포인터 보고서
3-1. 포인터란 ?
어떤 대상을 가리키는 것
포인터는 메모리에 저장된 것을 가리키기 위한 것이다. 가리킨다는 것은 포인터가 어떤 대상의 주소를 저장하고 있다는 것을 의미한다.
포인터는 메모리 주소를 저장하기 위한 변수이다.
3-2. 포인터를 사용하는 이유
1) 함수로 하나 이상의 값을 리턴하기 위해
2) 메모리의 정보를 쉽게 다루기 위해서
3) 메모리의 공간을 효율적으로 사용하기 위해서
3-3. 포인터 선언법
타입 *포인터명; //지정된 차입의 값을 가리키기 위한 포인터를 선언
int * ptr ;
ptr : 포인터의 이름
int * : 포인터의 타입
int : 포인터의 대상타입(포인터가 가리키는 대상의 타입
ptr가 가리키는 대상의 타입이 'int'이고, ptr의 타입은 'int*'이다.
3-4. 포인터 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include<stdio.h> int main() { int i = 5; int *p = &i; printf("i =%d\n", i); //변수 i에 저장된 수 printf("&i =%p\n", &i); //변수 i의 주소 printf("p =%p\n", p); //포인터에 저장된 주소 printf("&p=%p\n", &p); //포인터 p의 주소 return 0; } | cs |
변수 i의 값, 변수 i의 주소, 포인터에 저장된 주소, 포인터 p의 주소를 출력
3-5. &연산자와 *연산자
1) '&'연산자 = 주소 연산자 : 피연산자의 주소를 반환한다.
int i = 1;
int *ptr = &i; //변수 i의 주소를 포인터 ptr에 저장
2) '*'연산자 = 역참조 연산자 : 지정된 주소에 저장된 값을 반환한다.
포인터가 가리키는 대상에 저장된 값을 가져올 때는 '*'연산자 사용한다. 피연산자(포인터)가 가리키는 주소에 저장된 값을 읽어서 반환한다.
int i=200 ;
int *ptr = &i ; //포인터 ptr이 변수 i를 가리키게 된다.
3-6. Call by value 와 Call by reference
Call by value:
main 함수에서 선언한 변수 n에 10을 넣어주고 값을 받아서 func함수에서 다시 20을 넣어주는데 main함수에서의 n=10과 func함수에서의 n=20은 메모리상 다른 위치에 상주해 있으므로 다시 main함수로 넘어오면 수정했던 값이 없어진다.
Call by reference:
변수 n의 주소를 함수 func의 n에게 넘겨주었으므로 func에서 넣은 20이 그대로 n에 들어가게 된다.(둘은 같은 주소를 공유하고 있으므로)
3-7. Swap 함수 구현 및 설명
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include<stdio.h> #include<stdlib.h> void swap_r(int *a, int *b); int main() { int a, b; swap_r(&a, &b); printf("%d %d\n", a, b); //주소를 이용하여 바꾸어줌 system("pause"); return 0; } void swap_r(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } | cs |
설명 :
main함수에서 &a,&b를 이용하여 swap_r함수에 값을 전달했기 때문에 두 함수의 a,b는 같은 주소를 공유하고 있다.
swap_r함수에서 변수 temp를 선언하여 a->temp / a=b / b=temp로 두 a,b값을 바꿔주고 값을 main에서 출력하면 바뀐 두 값이 정상적으로 출력된다.