[정보처리기사] C언어 포인터 개념 잡기 | 예시 | 문제
목차
C언의 Pointer란?
변수에 지정된 실제 값(value)는 특정 주소지에 저장하게되는데, 포인터는 그 주소를 가르키는 것으로 볼 수 있습니다. 그리고 사실, 포인터는 C 언어에서 가장 널리 사용되는 개념이지만, Java와 Python을 비롯한 다른 프로그래밍 언어에서도 일부 기능이나 라이브러리를 통해 포인터와 유사한 개념을 사용할 수 있습니다.
언어 별 포인터의 기능
- C 언어:
- C 언어에서 포인터는 메모리 주소를 저장하는 변수로 사용됩니다. 포인터는 메모리의 특정 위치에 직접 접근하고 데이터를 조작할 수 있도록 합니다. 포인터 산술, 역참조 연산 등을 통해 메모리 주소를 조작하고 값을 변경할 수 있습니다.
- Java:
- Java는 보안 및 안정성을 강조하는 언어로, 직접적인 포인터 연산을 제공하지 않습니다. 그러나 Java에서는 객체 참조를 사용하여 유사한 개념을 다룰 수 있습니다. 객체 참조는 객체의 메모리 주소를 저장하는데 사용되며, 객체에 대한 간접적인 접근을 통해 메모리의 값을 변경할 수 있습니다.
- 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
'정보처리기사' 카테고리의 다른 글
정처기 실기 필수 과목 SQL 요약 | DML | DDL | DCL (0) | 2023.07.16 |
---|---|
[정보처리기사 실기] SQL 주요 명령어 | WHERE |DISTINCT|COUNT|BETWEEN|LIKE|IN|GROUP BY|ORDER BY|SUB QUERY|JOIN|SELF JOIN (0) | 2023.07.16 |
[정처기실기] 프로그램 언어활용 - JAVA 예제 풀기 (0) | 2023.07.12 |
[정치기 실기] 프로그램 활용 코드 예시 문제 | 반복문 | 재귀함수 | 정렬 알고리즘 (0) | 2023.07.11 |
[정처기실기] 프로그래밍 언어 활용 Python 기초 (0) | 2023.07.11 |
댓글