포인터란?🖱️
메모리의 주소값을 저장하는 변수입니다. [자료형 * 변수명] 의 형태로 선언하며, 값이 아닌 '값이 저장된 주소'를 가리킵니다.
- int * p = &a 는, p가 변수 a의 주소를 저장한다는 뜻입니다.
- &a: a의 주소값을 구함
- p: 포인터 p 가 가리키는 주소에 있는 값을 의미
- int * p = &arr[0] 과 int * p = arr 은 같습니다.
- int * p = &arr[1] 과 int * p = arr[1] 은 다릅니다.
- &을 붙이지 않으면 주소값이 아닌 두 번째 행 자체를 가리키는 것
예제를 통해 살펴보겠습니다.
#include <stdio.h>
int main() {
int a = 10;
int *p = &a;
printf("a의 값: %d\n", a); // 10
printf("a의 주소: %p\n", &a); // 예: 0x7ffeefbff58c
printf("p의 값: %p\n", p); // &a와 같음
printf("*p의 값: %d\n", *p); // 10 (p가 가리키는 주소의 값)
*p = 20; // 포인터를 통해 a의 값을 변경
printf("a의 새로운 값: %d\n", a); // 20
}
a의 값과 a의 주소는 다른 의미입니다. 포인터를 통해 a의 값을 변경할 수 있으며, *p=a, p=&a 입니다.
c언어는 기본적으로 함수에 인자를 넘길 때 복사본이 넘어가는 방식입니다. 이때 포인터를 넘기면 원본을 직접 조작하는 것이 가능해집니다.
void setToZero(int *p) {
*p = 0; // 원본 값 변경
}
int main() {
int a = 10;
setToZero(&a); // 주소를 넘김
printf("%d\n", a); // 0
}
20년도에 출제된 기출 예제를 살펴보겠습니다.
void main(){
char *p = "KOREA";
printf("%s\n", p);
printf("%s\n", p+3);
printf("%c\n", *p);
printf("%c\n", *(p+3));
printf("%c\n", *p+2);
}
정답은 아래와 같습니다.
KOREA
EA
K
E
M
이중 포인터(double pointer)🖱️
포인터를 가리키는 포인터의 포인터로, 즉 포인터의 주소를 저장합니다. 정보처리기사 시험에서도 나왔던 것으로 기억합니다.
포인터 자체를 조작하거나 변경하기 위해 사용합니다.
비슷한 예제를 통해 살펴보겠습니다.
#include <stdio.h>
int main() {
int a = 10;
int *p = &a;
int **pp = &p;
printf("a의 값: %d\n", a); // 10
printf("*p의 값: %d\n", *p); // 10
printf("**pp의 값: %d\n", **pp); // 10
// 주소 출력
printf("a의 주소: %p\n", &a);
printf("p의 값 (a의 주소): %p\n", p);
printf("p의 주소: %p\n", &p);
printf("pp의 값 (p의 주소): %p\n", pp);
}
p는 &a를, pp는 &p를 가리키고 있습니다. (pp) --> (p) --> (a) 라고 생각하면 됩니다.
'공부농장 > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] 개념 정리 (0) | 2025.04.17 |
---|---|
[정보처리기사 실기] C 기출 정리(24년) (0) | 2025.04.11 |
[정보처리기사 실기] Python 기출 정리(24년) (0) | 2025.04.08 |
[정보처리기사 실기] JAVA 기출 정리(24년) (0) | 2025.03.30 |