본문 바로가기

BackEnd/C

포인터 변수 선언

반응형

1. 포인터 변수?


포인터 변수란 주소 값의 저장을 위해 선언되는 변수이다.


2. 주소 값 얻기(&연산자)


&연산자는 피연산자의 시작 주소 값을 반환한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void)
{
    int num1=3;
    char num2='A';
    double num3=3.15;
 
    printf("num1의 저장위치: %#x \n"&num1);
    printf("num2의 저장위치: %#x \n"&num2);
    printf("num3의 저장위치: %#x \n\n"&num3);
 
    printf("num1의 주소 값 크기: %d \n"sizeof(&num1));
    printf("num2의 주소 값 크기: %d \n"sizeof(&num2));
    printf("num3의 주소 값 크기: %d \n\n"sizeof(&num3));
 
    return 0;
}
cs


1
2
3
4
5
6
7
8
num1의 저장위치: 0x62fe4c
num2의 저장위치: 0x62fe4b
num3의 저장위치: 0x62fe40
 
num1의 주소 값 크기: 4
num2의 주소 값 크기: 4
num3의 주소 값 크기: 4
 
cs


num1, num2, num3의 앞에 &연산자를 붙여서, 주소값을 얻고 있다.


주소 값의 크기는 32비트 시스템 기준으로 4바이트로 표현되고 있다.


3. 포인터 변수 선언 및 초기화


포인터 변수의 선언은 다음과 같이 하면된다.


int * ptr;    * 을 추가함으로써 ptr은 int형 변수가 아니라, 


int형 변수의 주소 값을 저장할 수 있는 포인터 변수이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(void)
{
    int num1 = 3;
    char num2='A';
    double num3=3.15;
 
    int * ptr1=&num1;//int형 포인터 변수 선언
    char * ptr2=&num2;//char형 포인터 변수 선언
    double * ptr3=&num3;//dobule형 포인터 변수 선언
 
    printf("num1의 저장위치: %#x \n", ptr1);
    printf("num2의 저장위치: %#x \n", ptr2);
    printf("num3의 저장위치: %#x \n\n", ptr3);
 
    printf("포인터 변수 ptr1의 크기: %d \n"sizeof(ptr1));
    printf("포인터 변수 ptr2의 크기: %d \n"sizeof(ptr2));
    printf("포인터 변수 ptr3의 크기: %d \n\n"sizeof(ptr3));
 
    return 0;
}
cs


1
2
3
4
5
6
7
num1의 저장위치: 0x62fe4c
num2의 저장위치: 0x62fe4b
num3의 저장위치: 0x62fe40
 
num1의 주소 값 크기: 4
num2의 주소 값 크기: 4
num3의 주소 값 크기: 4
cs

7~9행에서 포인터 변수 선언과 동시에 초기화 했다.


13~15행에서는 포인터 변수의 크기를 출력했다. 이는 앞서본 예제의 주소값의 크기를 출력한것


 크기가 동일하다. 이 예제를 통해 int형 포인터이건, char형 포인터이건 모든 포인터는 크기가 동


일하고 포인터는 상수이건 변수이건 항상 크기가 동일하다.


그리고 7~9행을 통해 형성되는 메모리 구조상의 관계를 그림으로 봐보자



위 그림을 보면 1바이트짜리 변수 num2를 참조하는 포인터 변수 ptr2의 크기가 4바이트이다.


사각형의 크기가 바이트 크기를 의미한다. 어차피 첫 번재 바이트의 주소값을 저장하는 것이 포인


터 변수이기 때문에 대상이 1바이트 이건, 4바이트이건 무조건 4바이트로 선언이 되어 메모리 공간


 참조한다. 그리고 아래 그림을 보면 num1, num2, num3 메모리 공간에 나란히 할당 되었다는 가


정하에 ptr1,2,3가 참조하는 것을 보여준다.




반응형

'BackEnd > C' 카테고리의 다른 글

잘못된 포인터 사용의 예와 NULL 포인터  (0) 2019.03.12
포인터 형과 *연산자  (0) 2019.03.12
포인터와 메모리  (0) 2019.03.11
포인터  (0) 2019.03.11
2차원 배열을 함수의 인자로 전달  (0) 2019.03.11