FastCampus All-In-One 패키지 중 C/C++ 수업을 듣고 정리한 자료입니다.
실행환경: Windows 10
학습목표
- 포인터의 개념과 활용 방법을 학습
- 포인터를 사용했을 때의 강력한 기능을 이해
포인터의 개념
- 변수는 그 자체로 자신의 자료형에 맞는 값을 저장한다
- 포인터(Pointer)변수는 특이한 변수로 메모리 주소를 저장한다.
-
포인터는 특정한 변수 자체가 존재하는 메모리 주소의 값을 가진다.
-
위의 예제에서는 기존 a를 이용하거나
포인터 변수인 b를 이용해서도 5라는 값을 찾을수 있다.
-
int *b = &a;
처럼선언할 때
쓰는*
는 포인터 변수임을 알려주는 목적 -
이후에
*b
라고 쓰면 포인터 변수 b가 가리키는 주소의 값을 의미
포인터 관련 연산자
주소 연산자(&)
- 변수 앞에 붙어서 변수의 메모리 시작 주소값을 구한다포인터(*)
- 포인터 변수를 선언할 때 사용한다간접 참조 연산자(*)
- 선언된 포인터 변수가 가리키는 변수를 구한다
포인터의 개념 예시
#include <stdio.h>
int main(void) {
int a = 5;
int *b = &a;
printf("%d\n", *b);
system("pause");
}
int *b
와printf("%d\n", *b)
의*b
는 생긴것만 같고 기능은 다르다
결과
5
계속하려면 아무 키나 누르십시오 . . .
배열 각 원소의 주소 값 출력하기
#include <stdio.h>
int main(void) {
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i;
for (i = 0; i < 10; i++) {
printf("%d\n", &a[i]);
}
system("pause");
}
결과
15989360
15989364
15989368
15989362
15989366
15989360
15989364
15989368
15989362
15989366
계속하려면 아무 키나 누르십시오 . . .
-
각 컴퓨터 마다 저장 값이 다르므로 결과는 다르게 나올수 있다.
-
끝자리가 4씩 증가하는지 확인
포인터의 강력한 기능
- 포인터는 컴퓨터 시스템의 특정한 메모리에 바로 접근할 수 있다.
- 따라서 기존에 존재하던 중요한 메모리 영역에 접근하지 않도록 해야한다
- 주소값만 보면 해당 변수가 어떤 역할을 하는지 모르기 때문에 조심해야함.
int *a = 0x33484735;
*a = 0;
다중 포인터 예시
#include <stdio.h>
int main(void) {
int a = 5;
int *b = &a;
# 포인터의 포인터 변수라는 의미
# 간접 참조 연산자를 두번 넣어야한다
int **c = &b;
printf("%d\n", **c);
system("pause");
}
결과
5
계속하려면 아무 키나 누르십시오 . . .
배열과 포인터 예시
#include <stdio.h>
int main(void) {
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *b = a;
printf("%d\n", b[2]);
system("pause");
}
- a라는 배열의 이름 자체를 주소값으로 사용
- 내부적으로 배열의 이름 자체는 주소값 자체를 가지고 있기 때문에 위 처럼 사용 가능(
&
이 안붙은 이유)
결과
3
계속하려면 아무 키나 누르십시오 . . .
요약
- 포인터는 특정한 변수가 메모리 상에 존재하는 위치 주소를 저장한다.
- 포인터는 특정한 메모리 주소에 바로 접근할 수 있으므로 조심스럽게 사용해야 한다.
Comments