본문 바로가기
정보처리기사

[정보처리기사 실기] C언어 포인터 개념 잡기 | 예시 | 문제 | 활용

by 공불러 2023. 7. 14.
728x90
반응형

[정보처리기사] C언어 포인터 개념 잡기 | 예시 | 문제

목차

    C언의 Pointer란?

    변수에 지정된 실제 값(value)는 특정 주소지에 저장하게되는데, 포인터는 그 주소를 가르키는 것으로 볼 수 있습니다. 그리고 사실, 포인터는 C 언어에서 가장 널리 사용되는 개념이지만, Java와 Python을 비롯한 다른 프로그래밍 언어에서도 일부 기능이나 라이브러리를 통해 포인터와 유사한 개념을 사용할 수 있습니다. 

    언어 별 포인터의 기능

    더보기
    1. C 언어:
      • C 언어에서 포인터는 메모리 주소를 저장하는 변수로 사용됩니다. 포인터는 메모리의 특정 위치에 직접 접근하고 데이터를 조작할 수 있도록 합니다. 포인터 산술, 역참조 연산 등을 통해 메모리 주소를 조작하고 값을 변경할 수 있습니다.
    2. Java:
      • Java는 보안 및 안정성을 강조하는 언어로, 직접적인 포인터 연산을 제공하지 않습니다. 그러나 Java에서는 객체 참조를 사용하여 유사한 개념을 다룰 수 있습니다. 객체 참조는 객체의 메모리 주소를 저장하는데 사용되며, 객체에 대한 간접적인 접근을 통해 메모리의 값을 변경할 수 있습니다.
    3. Python:
      • Python은 C와 Java보다 더 추상화된 언어로, 명시적인 포인터 개념을 제공하지 않습니다. 그러나 Python에서는 "참조" 개념을 사용하여 객체를 전달하고 수정할 수 있습니다. 함수 호출 시에는 실제 객체의 참조가 전달되며, 이를 통해 객체를 간접적으로 수정할 수 있습니다.
    #include <stdio.h>
    
    void swap(int* a, int* b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int main() {
        int num1 = 10;
        int num2 = 20;
        
        printf("Before swapping: num1 = %d, num2 = %d\n", num1, num2);
        
        swap(&num1, &num2);
        
        printf("After swapping: num1 = %d, num2 = %d\n", num1, num2);
        
        return 0;
    }
    #결과
    Before swapping: num1 = 10, num2 = 20
    After swapping: num1 = 20, num2 = 10

    정보처리기사 실기 시험에서의 비중

    정보처리기사 실기에서 C언어는 1~2문제가 꼭 출제 됩니다. 그 중에서 당연히 포인터가 내기 좋은 문제 이기 때문에 잘 출제되는 편입니다. 정보처리기사 프로그램 언어 활용 문제는 크게 알고리즘과 각 언어의 특성을 물어보는 경우가 있습니다. C의 경우에는 포인터나 사용자 정의 함수가 적합하죠. 수험생들이 가장 헷갈려 할만한 Pointer를 주로 내고 있습니다.

     

    다음 예시코드를 하나하나 톺아 보겠습니다.

    int main()
    {
        int c = 5;
        int* pc = &c;
        pc = &c;
        printf("%d", *pc);
    }

     

    포인트형 변수 선언 방법

    코드 데이터 타입 포인터 변수명 연산자 변수명
    int*pc =&c int *(변수가가르키는
    메모리위치)
    pc &
    (변수의주소)
    c

    변수와 동일하게 쓸 수 있는 경우

    변수 표현 포인터 표현
    y=x+1 y=*ptr+1
    x=x+10 *ptr=*ptr+10
    x+=5 *ptr+=5
    ++x ++*ptr
    =++x ++*ptr
    x++ (*ptr)++

    포인터 + 배열

    ptr +1은 다음 주소, ptr-1은 이전 주소와 같이 사용할 수 있으며, 직접 변수를 부르지 못하는 경우에 유용하게 쓸 수 있습니다. 아래의 내용은 포인터의 이해를 위한 간단한 과정이며, 실사용은 보다 활용적으로 쓸 수 있습니다.

    #include <stdio.h>
    
    int main() {
        int x[5] = {10, 20, 30, 40, 50};
        int* ptr;
    
        ptr = x;  // 배열 x의 첫 번째 요소의 주소를 ptr에 할당
    
        printf("Values using pointer:\n");
        for (int i = 0; i < 5; i++) {
            printf("ptr[%d] = %d\n", i, *(ptr + i));  // 포인터를 통해 배열 요소 접근
        }
    
        printf("\nValues using array indexing:\n");
        for (int i = 0; i < 5; i++) {
            printf("x[%d] = %d\n", i, x[i]);  // 배열 인덱싱을 통한 배열 요소 접근
        }
    
        return 0;
    }
    Values using pointer:
    ptr[0] = 10
    ptr[1] = 20
    ptr[2] = 30
    ptr[3] = 40
    ptr[4] = 50
    
    Values using array indexing:
    x[0] = 10
    x[1] = 20
    x[2] = 30
    x[3] = 40
    x[4] = 50

    변수의 주소를 가르쳐 값을 찾는 방법, 포인터 ptr은 x[0]의 주소를 가리키므로, *ptr은 x[0]의 값을 의미합니다. 또한, ptr + 2는 x[2]의 주소를 가리키며, *(ptr + 2)는 x[2]의 값을 의미합니다. 포인터를 사용하여 배열의 요소에 접근할 때는 *(ptr + i)와 같은 방식을 사용합니다.

    변수 주소
    x[0] &x[0] 10
    x[1] &x[1] 20
    x[2] &x[2] 30
    x[3] &x[3] 40
    x[4] &x[4] 50
    ptr &x[0] 10

    포인터 활용 예시

    함수를 통해 두 변수의 값을 교환하는 swap 함수를 구현할 때 포인터를 사용하는 예시를 보여드리겠습니다. 포인터를 사용하면 변수의 주소를 전달하여 값의 교환을 함수 내에서 수행할 수 있습니다. 그렇지 않으면 main 문에서 a,b를 출력할 수 없어 바뀐 숫자를 불러오기 쉽지 않습니다.

    #include <stdio.h>
    
    void swap(int* a, int* b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int main() {
        int num1 = 10;
        int num2 = 20;
        
        printf("Before swapping: num1 = %d, num2 = %d\n", num1, num2);
        
        swap(&num1, &num2);
        
        printf("After swapping: num1 = %d, num2 = %d\n", num1, num2);
        
        return 0;
    }
    Before swapping: num1 = 10, num2 = 20
    After swapping: num1 = 20, num2 = 10
    728x90
    반응형

    댓글