반응형
▶ 포인터의 개념포인터(Pointer)는 주소(Address)를 저장하는 변수입니다.
- 메모리에는 각각의 바이트를 구분하기 위한 주소가 있습니다.
- 주소라하면 해당 값이 저장된 컴퓨터 메모리상의 주소를 의미합니다. (예를 들면 num이란 변수에 10의 값이 저장 되어 있다면 *p라는 포인터 변수에 num의 주소가 저장된다는 것입니다.)주소의 크기도 플랫폼에 따라 다릅니다.
- 32비트 플랫폼에서는 주소가 4바이트이고, 64비트 플랫폼에서는 주소가 8바이트입니다.포인터 변수를 만들 때는 변수 이름 앞에 *를 넣어주면 그 변수는 포인터 변수가 됩니다.
▶ 포인터의 선언
>>포인터를 선언할 때 지정하는 데이터형은 포인터가 가리키는 변수가 데이터형이다.
int *p;
위에서 int는 포인터가 가리키는 변수의 데이터형을 의미하고 *는 포인터 수식어, p는 포인터 변수명을 의미한다.
■ 포인터 함수를 이용한 예시를 간단하게 만들어 보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int x = 10;
int* p = &x;
printf(" x의 값 : %d\n",x);
printf(" x 변수의 주소 값 : %p\n",&x);
printf(" p 변수의 값 : %p\n", p);
printf(" p가 가리키는 값 : %d\n", *p);
printf(" p 변수의 주소 값 : %p\n", &p);
*p = 20; //*p의 재정의
printf(" p가 가리키는 값 : %d\n", *p);
return 0;
}
|
cs |
■ 포인터 함수를 이용한 예시 실행 결과
위의 결과를 보면 p의 실질적인 값은 x의 주소이며 x의 값을 가리킨다는 것이 보여집니다.
여기서 &연산자는 &의 오른쪽에 오는 피연산자의 주소 값을 반환하는 연산자입니다.
&x는 주소 값이므로 &p로 출력하고 *p는 int형 변수이므로 %d로 출력, 포인터도 변수이므로 주소가 있습니다.
그리고 보다 눈에 보이는 결과를 위해 *p=20으로 재정의하고(x=20으로 수행됩니다.) 결과를 확인해보았습니다.
▶ 포인터의 용도
변수의 이름을 직접 사용할 수 없을 때 함수를 호출한 곳에 있는 지역 변수를 포인터를 이용해서 변경할 수 있습니다.
■ 포인터 함수 용도 예시를 간단하게 만들어 보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void test1(int x) {
x = 20;
}
void test2(int* p) {
*p = 30;
}
int main() {
int x = 10;
test1(x);
printf("test1 호출 후에 x의 값 : %d\n", x);
test2(&x);
printf("test2 호출 후에 x의 값 : %d\n", x);
return 0;
}
|
cs |
■ 포인터 함수 용도 예시를 간단하게 만들어 보았습니다.
■ 포인터가 어떤 변수를 가리키게 될지 아직 모르는 경우
- 포인터가 가리키는 변수가 프로그램 실행 중에 조건에 따라서 결정된다.
- 여러 변수에 대한 처리를 공통의 코드로 수행하게 만들 수 있다.
▶ 포인터 사용 시 주의사항
- 포인터는 초기화하고 사용하는 것이 안전합니다.
- 포인터를 초기화하지 않고 사용하면 실행 에러가 발생합니다.
- 어떤 변수를 가리킬지 알 수 없을 때는 널 포인터로 초기화합니다.
- 포인터를 안전하게 사용하기 위해서는 사용할 때 널 포인터인지 검사하고, 널 포인터가 아닌 경우에만 포인터가 가리키는 변수에 접근합니다.
- 포인터의 데이터형과 포인터가 가리키는 변수의 데이터형이 같아야 합니다.
아직 포인터에 대해 글을 완벽히 정리하지 못하여 정리한 부분까지만 포스팅합니다.
반응형
최근댓글