C/C언어 이론

(8)Pointer

T_Y 2018. 6. 20. 13:37
반응형

포인터 (Pointer)

- 메모리 주소를 저장하는 '변수'

> 다른 값이 저장된 공간(변수)를 가리킨다.


- type * 포인터변수명 type 배열변수명[]

> 포인터변수의 type은 가리킬 변수의 type과 일치해야 한다.

>> '주소 값'은 정수이지만, 자료형별로 실제 크기가 다르기 때문

>> '주소 값'의 범위는 4byte --> 포인터변수의 크기는 4byte


- 주소를 다루는 방법 : &연산자 (주소 연산자)

> scanf("%d", &iNum);

> &연산자는 변수의 주소 값을 반환한다. (연산의 결과가 주소 값)

>> 시작 주소를 가르쳐준다. (type의 크기에 맞게 알아서 공간 사용)

- 포인터를 다루는 방법 : *연산자 (간접 참조 연산자)

> int * pNum = NULL;   // NULL은 초기화 값

> NULL은 정수 0이다. (포인터인 것을 명시하려고 사용)

> 포인터에서 0은 주소 값이 0이다! 라고 해석하는게 아니라,

가리키는 공간이 없다고 해석


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
 
void main()
{
    int iNum = 0;
    int * pNum = NULL;
    int * pNum2 = &iNum;
    int * pNum3 = NULL;
 
    iNum = 10;        // int이기 때문에 iNum 공간에는 정수를 저장할 수 있다.
    pNum = &iNum;    // 포인터변수이기 때문에 pNum 공간에는 주소를 저장
 
    printf("iNum의 값 : %d\n", iNum);
    printf("iNum의 주소 : %d\n"&iNum); // &연산에 의해 iNum 공간의 주소가 반환
    printf("iNum의 주소 : %#p\n"&iNum); // 16진수로 주소 값 출력
 
    printf("pNum의 값 : %d\n", pNum); // pNum은 iNum의 주소값을 저장하고 있다.
 
    printf("pNum의 값(주소)을 따라간 공간의 값 : %d\n"*pNum);
    // (1) pNum : 포인터 변수를 그대로 사용 (내 공간의 값 = 주소 값)
    // (2) *pNum : 내 공간의 주소를 따라가서 그 공간의 값을 사용 (간접 참조)
    //  --> 정수 값을 저장할 수 있는 공간은 현재 iNum 밖에 없다.
    //        이 공간을 접근할 수 있는 방법이 늘어났다. (포인터 변수를 통해~~)
 
    *pNum = 20// pNum이 저장하고 있는 주소를 따라간 그 공간의 값을 변경
    printf("iNum = %d\n", iNum);
    printf("*pNum = %d\n"*pNum);
 
    // pNum 과 &iNum은 같다. --> iNum 변수의 주소 값
    // *pNum 과 iNum은 같다. --> iNum 변수의 값
 
    *pNum3 = iNum;
    printf("*pNum3 = %d\n"*pNum3);
    // pNum3 포인터 변수의 값은 NULL (0) 이다.
    // 간접 참조(*)할 공간이 없다... 그래서 오류!
}
cs



반응형

'C > C언어 이론' 카테고리의 다른 글

(10)MemoryAllocation  (0) 2018.06.20
(9)struct  (0) 2018.06.20
(7)Array  (0) 2018.06.20
(6)Function  (0) 2018.06.20
(5)Repetitive  (0) 2018.06.20