본문 바로가기
Programming/C

[C] 짱짱 포인터 분석 2

by graygreat 2017. 4. 10.
728x90
반응형

 많은 시간이 걸렸던 과제... 배운건 많았던 것 같다...


#include<stdio.h>

int main() {
    char arr[3][6] = { { "APPLE\n" },{ "GRAPE\n" },{ "MANGO\0" } }; // 3-6 이차원 배열 선언
    char *p;  // 포인터 변수 p 선언
    char **pp;  // 이중 포인터 pp 선언
    int i;

    p = arr;  // p의 주소값에 배열 arr 주소값 삽입
    pp = &p;  // pp의 주소값에 포인터 변수 p의 주소값 삽입 - 이중포인터

    for (i = 0; i < 18; i++) {
        printf("%c", *p);      // p에 저장된 포인터가 가리키는 값 출력
        p++;                   // p의 주소값 1씩 증가 (char형 - 1바이트)
    }

    p = p - 12;     // p의 주소값을 12 뺀다(17 - 12 = 5)
    printf("\n%c\n", *p);   // 5번째 p의 포인터가 가리키는 값 출력 --> G

    printf("%c\n", *((*pp) + 2)); /* 포인터p의 주소값이 5번째 --> 포인터 변수 p의 주소값 pp의 포인터가 가리키는 값도 G를 가리킴.
                                  --> *pp에 2를 더하면 7번째 있는 값 출력*/
    printf("%c\n", **pp);  // 포인터 p의 주소값의 주소값의 포인터값 
    printf("%s\n", *(pp)); // 이중포인터 pp에 있는 주소의 포인터 값

    *pp = (*pp) + 3;  // pp의 포인터가 가리키는 값 + 3 --> P
    printf("%c%c%c%c \n", *(*pp++), *(*pp + 4), *(*pp - 5), **pp); 
    // pp의 포인터가 가리키는 값에 후치연산을 하였지만 값은 변하지 않음 --> P
    // pp의 포인터에 4를 더하면 --> A
    // pp의 포인터가 가리키는 값(P) 의 5번째 앞 포인터가 가리키는 값 -- > E
    // *pp의 포인터가 가리키는 값 --> P

    /* printf("%c \n", **pp);를 하게 게되면 Segmentation fault (core dumped)가 띄는데
       그 이유는 *(*pp++)에서 연산자 우선순위를 보게되면 알 수 있다. */
    return 0;
}



반응형

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

[C] strcmp 함수 구현하기  (0) 2017.04.10
[C] 난수 최대값 구하기  (0) 2017.04.10
[C] 짱짱 포인터 분석 1  (0) 2017.04.09
[C] N x N 행렬 오름차순 ㄹ 정렬  (0) 2017.04.03
[C] N x N 행렬 오름차순 역순 정렬  (0) 2017.04.03

댓글