(8-3)Pointer

C/C언어 이론 2018. 10. 3. 18:47
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
 
void main()
{
    /*
        배열과 포인터
            - 배열명은 첫 번째 요소의 주소 (시작주소/첫번째byte)
                > 2차원 배열에서 [][]  인덱스를 하나만 [] 사용하면 한 행의 시작주소
            - 배열변수를 포인터변수에 저장하면 똑같이 다룰 수 있다.
                > 차이점
                    1. 크기
                    2. 변수의 연산 여부
    */
 
    int iArr[5= { 1,2,3,4,5 };
    int * pArr    = iArr; // iArr가 주소 값이기 때문에 대입이 가능!
    int i = 0;
 
    printf("배열명 자체의 값 : %d\n", iArr); // 생성된 배열의 시작 주소
    printf("배열 첫 번째 요소의 주소 : %d\n"&iArr[0]); // iArr와 같다.
    printf("배열명이 가리키는 값 : %d\n"*iArr); // 주소값 앞에는 * 간접참조연산을 사용 가능
    printf("배열 첫 번째 요소의 값 : %d\n", iArr[0]);
 
    printf("포인터 변수의 값 : %d\n", pArr);
    printf("포인터의 첫 번째 주소 : %d\n", (pArr+0) ); // +0이라서 pArr이다.
    printf("포인터의 두 번째 주소 : %d\n", (pArr+1) ); // 
    // 주소값 + 정수  --> 자료형 크기에 맞게 정수와 곱해진다.
    // int 라면, +1을 했을 때 주소 값이 +4 가 된다. (int는 4byte)
    // double 이라면, +2 를 했을 때 주소 값이 +16이 된다. (dobuble이 8byte)
 
    printf("포인터가 가리키는 값 : %d\n"*pArr);
    printf("포인터의 첫 번째 값 : %d\n"*(pArr+0) ); // +0이라서 pArr이다.
    printf("포인터의 두 번째 값 : %d\n"*(pArr+1) ); //
 
    printf("===============\n");
 
    for(i = 0; i < 5; i++// 편의상 iArrLen을 구하지 않음... (귀찮..)
    {
        printf("[%d회차 수행]\n", (i+1));
        printf("배열 각 요소의 주소 : %d\n", (iArr+i));
        printf("배열 각 요소의 값 : %d\n"*(iArr+i));
        printf("배열 각 요소의 값 : %d\n"*(iArr)+i); // 첫요소 + i
 
        printf("포인터 각 요소의 주소 : %d\n"&pArr[i]);
        printf("포인터 각 요소의 값 : %d\n", pArr[i]);
        // 배열 변수와 포인터 변수는 둘 다 주소 값을 의미
        //  배열 변수로도 주소값+정수 를 사용할 수 있다.
        //  포인터 변수로 인덱스를 사용할 수 있다.
        //   --> 주소값+정수 형태 보다는 인덱스 형태가 우리에게 좀 더 보기 편함
    }
 
    printf("================\n");
    // 차이점
 
    // (1) 크기
    printf("iArr의 크기 : %d\n"sizeof(iArr));
    printf("pArr의 크기 : %d\n"sizeof(pArr));
    // 포인터변수의 크기는 무조건 4
 
    // (2) 연산 여부
    for(i = 0; i < 5; i++)
    {
        /*
        printf("포인터 각 요소의 값 : %d\n", *pArr);
        pArr++; // pArr = pArr + 1;    pArr += 1;  -> pArr의 값이 변경
        */
 
        /*
        printf("포인터 각 요소의 값 : %d\n", *(pArr++)); // 후위증감
        // pArr 변수에 저장된 주소 값을 사용하고 난 뒤, 1 증가
        */
 
        /*
        printf("포인터 각 요소의 값 : %d\n", *(++pArr)); // 전위증감
        // pArr 변수의 값을 1증가 시킨 뒤, 그 값을 사용
        */
 
        // iArr++; // 이거 안 됨 : 배열명은 생성되는 순간 '상수' 처리된다.
                    // 상수 : 변경할 수 없는 값
                    // 배열명 자체는 연산으로 값을 변경하는 행위가 불가능
    }
 
    printf("for문이 끝난 뒤 pArr가 가리키는 값 : %d\n"*pArr);
 
}
cs






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

(9-1)struct  (0) 2018.10.03
(8-4)Pointer  (0) 2018.10.03
(8-2)Pointer  (0) 2018.10.03
(8-1)Pointer  (0) 2018.10.03
(7-4)Array  (0) 2018.10.03

설정

트랙백

댓글