반응형

안녕하세요.

오늘은 포인터에 대해 알아보도록 하겠습니다.

 

포인터

단순히 포인터라는 단어의 뜻만 보면, 무언가를 가리키는 것 정도의 의미가 되는데,

C언어에는 주소 값을 가리키기 위한 형식을 뜻하게 됩니다.

메모리 공간의 주소값을 가리킬 수 있기 때문에 동적 메모리 할당에 많은 이점을 가질 수 있게 됩니다.

형식

데이터타입* 포인터 변수명;

포인터 변수명 = &변수;

*포인터 변수 = 변수;

- 데이터 타입* 포인터 변수명;
데이터 타입에 "*"을 붙이면 포인터 변수가 됩니다.
메모리 공간은 타입에 상관없이 4바이트를 차지하게 됩니다.

- 포인터 변수명 = &변수;
변수에 주소라는 의미인 "&"를 변수 앞에 넣어서 포인터 변수에 주소 값을 대입할 수 있습니다.

- *포인터 변수 = 변수;
포인터 변수를 선언할 때는 "*"가 포인터 변수 타입이라는 것을 나타내지만 대입할 때에는 가리키는 값이라는 코드가 됩니다.
포인터 변수에 일반 변수 값을 대입하기 위해서는 포인트 변수 앞에 "*"를 넣어 변수를 대입합니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
void main()
{
    int* p;
    int nNum = 5;
    p = &nNum;                    // nNum의 주소값을 p에 저장합니다.
    printf("*p = %d\n"*p);    // p의 가르키는 값을 출력합니다.
    printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
    printf("==================\n");
    *= 10;                    // p가 가르키는 값 10으로 변경합니다.
    printf("*p = %d\n"*p);    // p의 가르키는 값을 출력합니다.
    printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
    printf("==================\n");
    nNum = 15;
    printf("*p = %d\n"*p);    // p의 가르키는 값을 출력합니다.
    printf("nNum = %d\n", nNum);// nNum 값을 출력합니다.
}
 
cs

 

배열과 포인터

배열에 인덱스를 적지 않고 쓴다면 포인터변수와 마찬가지로 사용할 수 있게됩니다.

예제

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
void main()
{
    int arrNum[5= {1,2,3,4,5};
    
    int i;
    for ( i = 0; i < 5; i++ )
        printf("%d\n"*(arrNum+i));
}
cs

코딩 팁

보통은 포인터변수 초기값을 null(널)값으로 설정합니다.

짧은 코드에서는 상관이없지만, 코드가 많아지면 포인터 변수에 주소값을 대입하는걸 깜빡하게 될 수 있어서 체크하는 코드를 넣어야합니다.

다음과 같이 사용합니다.

1
2
3
int* pNum = null; 
if(pNum != null) 
    *pNum = 5;
cs

 

주소 값 변화를 확인하는 방법(VS 2019)

1. F5키 또는 메뉴 - 디버그 - 디버깅 시작을 누릅니다.

2. 메뉴 - 디버그 - 창 - 메모리 - 메모리 로 메모리 창을 엽니다.

다음과 같은 창이 생깁니다.

변수에 "&"를 앞에 넣어서(예를들면 "&nNum")를 주소에 넣고 엔터를 누릅니다.

그럼 해당 변수에 해당되는 주소로 이동합니다.

디버깅하면서 한스탭씩 넘어가는 것(F10)을 확인 합니다.

변수값이 변하면 주소에 해당하는 변수가 변경되는 것을 확인할 수 있습니다.

반응형

+ Recent posts