생선이의 잡다한 블로그

C언어 강좌 31 - 포인터 변수 본문

프로그래밍/C언어 강좌

C언어 강좌 31 - 포인터 변수

생선스프 2018. 3. 18. 00:28
반응형

안녕하세요 생선스프입니다!


이번 강좌에서는 포인터 변수를 알아보려고 합니다.


포인터 변수에는 일반 변수와는 다르게 메모리의 주소값이 들어가게 됩니다.


그리고 포인터 변수는 자료형 * 변수명 으로 선언합니다.

자료형과 변수명 사이에 있는 *의 위치는 중간에만 있다면 어디에 있어도 문제가 없습니다.


이제 아래 코드를 먼저 보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void main()
{
    int num1 = 10;
    int * numPtr;
 
    numPtr = &num1;
 
    printf("%p %p"&num1, numPtr);
}
 

cs


위의 코드는 num1의 주소값을 numPtr이라는 포인터 변수에 넣고 출력하는 코드입니다


즉, 같은 값이 출력되는 것이죠



그럼 이제 이 포인터 변수에 주소를 담았으면 이 주소에 있는 값을 가져올 수도 있어야겠네요


아래 코드를 보겠습니다


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
void main()
{
    int num1 = 10;
    int * numPtr;
 
    numPtr = &num1;
 
    printf("%d"*numPtr);
}
cs


위의 코드를 실행시키면 num1의 값인 10이 출력됩니다


즉 numPtr에 저장된 주소에 있는 값을 *을 이용해서 가져온 것입니다

여기서 *역참조 연산자라고 합니다


* 하나에 한 번 따라간다고 보면 됩니다.

만약 *이 두 개라면 한 번 갔는데 그게 또 포인터 변수라면 또 갈 수 있는것이죠


아래의 코드처럼 말이죠


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
void main()
{
    int num1 = 10;
    int * numPtr1;
    int ** numPtr2;
 
    numPtr1 = &num1;
    numPtr2 = &numPtr1;
 
    printf("%d"**numPtr2);
}
cs


그럼 이 포인터 변수가 왜 필요한 것일까요?


크게 두 가지 경우가 있습니다

1. 함수의 반환값을 두 개 이상 받아오기 위해

2. 동적할당시에 메모리 값을 저장하기 위해


두 번째 이유인 동적할당은 나중에 강좌로 다시 보도록 하고

우선 첫 번째 이유를 보도록 하겠습니다


저희가 사칙연산을 해주는 함수를 만든다고 하겠습니다

함수 하나로 덧셈, 뺄셈, 곱셈, 나눗셈을 한 결과를 전부다 리턴해 줄 수는 없습니다

return으로는 오직 한 개의 값밖에 반환할 수 없기 때문이죠


이때 포인터 변수를 이용해주면 됩니다


함수의 인자값으로 두 개의 수와 결과 값을 저장해둘 변수의 주소를 담아둔 포인터 변수를 넘겨주면 되겠네요

아래와 같이 말이죠


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
void calc(int num1, int num2, int * sum, int * sub, int * mul, int * div)
{
    *sum = num1 + num2;
    *sub = num1 - num2;
    *mul = num1 * num2;
    *div = num1 / num2;
}
 
void main()
{
    int num1 = 3, num2 = 2, sum, sub, mul, div;
 
    int *sumPtr, *subPtr, *mulPtr, *divPtr;
    sumPtr = &sum;
    subPtr = &sub;
    mulPtr = &mul;
    divPtr = &div;
 
    calc(num1, num2, sumPtr, subPtr, mulPtr, divPtr);
 
    printf("%d %d %d %d",sum,sub,mul,div);
}

cs


위의 코드를 보면 각각의 포인터 변수들에 값을 저장할 변수의 주소값을 넘겨줍니다.

그리고 각각의 연산을 한 뒤에 그 주소가 가리키는 곳에다가 값을 넣어줍니다.

여기서 중요한 것을 반드시 포인터 변수는 포인터 형태로 받아주어야 합니다


이런 식으로 하나의 함수에서 여러개의 값을 건드릴 수 있습니다.


그럼 이번 강좌는 여기서 마치도록 하겠습니다

강좌 읽어주셔서 감사합니다



공감과 댓글은 생선에게 힘이됩니다!

더 많은 C언어 강좌

반응형
Comments