12. 포인터의 이해
I. 포인터란 무엇인가?
- 포인터란 메모리의 주소 값을 저장하기 위한 변수이다.
- 포인터는 타입에 상관없이 그 크기가 4바이트임을 알 수 있다.
-
포인터 선언하기
- int n = 7;
- int *pN = n;
-
주소와 관련된 연산자 : &연산자, *연산자
- 주소값을 참조할 때 사용하는 연산자 : &
- 포인터가 가리키는 메모리 참조 : *
- int main()
-
{
- int a =2005;
- int *pA = &a;
- printf("%d",pA);
- printf("%d,*pA);
- }
- *pA는 2005로 출력된다.
- pA는 a의 주소값이 들어가 있다.
- 포인터에 대한 예제
-
- #include<stdio.h>
- int main(void)
-
{
- int a = 2005;
- int *pA = &a;
- printf("pA : %d\n",pA);
- printf("&a : %d\n",&a); //직접 접근
- (*pA)++;
- printf("a: %d\n",a);
- printf("*pA: %d\n",*pA); //간접 접근
- return 0;
- }
- 실행 시키면 어떤식으로 돌아가는지 이해 할 것이다.
-
포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 한다.
- 포인터 int 형 일경우 읽어들인 주소값에서 4바이트 만큼 읽어들이고, double 형일 경우 8바이트를 읽어들인다는 것을 알려 주는 역할
II. 잘못된 포인터의 사용
int main()
{
int *pA;
*pA = 10;
return 0;
}
-
이 소스는 잘못 된 것이다. 무엇이 잘못 된 것일까?
- pA라는 포인터 변수를 초기화 하지 않았을 뿐더러 10을 넣으려고 하면 메모리 어디에 들어갈지 모르니 오류가 발생한다.
int main()
{
int *pA = 100;
*pA = 10;
return 0;
}
-
이 소스는 잘못 된 것이다. 무엇이 잘못 되었는가?
- 위 소스는 첫번째 소스와 거의 동급이다 .포인터는 선언 동시에 초기화를 해주는 것이 좋은데 위와 같은 이유로 어디에 들어갈지 모르니 오류가 발생한다.
- 그럼 어찌 초기화 해야 할까?
int main()
{
int *pA;
int a = 10;
pA = &a;
return 0;
}
-
이 소스 처럼 pA를 주소값으로 초기화를 시키면 초기화 시킨 주소값이 들어가므로 오류가 나지 않는다.
문제
12 -1
문제 1
다음 프로그램 실행 시 포인터와 변수와의 관계를 나름대로 그림을 그려서 설명해 보자, 출력 결과도 예상해 보자
- #include<stdio.h>
- int main()
- {
-
int n = 10;
-
int *p1 = &n;
-
int *p2 = p1;
-
printf("%d\n",(*p1)++);
-
printf(%d\n",(*p2)++);
-
printf("%d\n",n);
-
return 0;
- }
문제 2
char형 변수 a, int형 변수 b, float형 변수 c, double 형 변수 d, 이렇게 총 4개의 변수를 선언하자(초기값은 알아서..) 그리고 포인터 p1, p2, p3, p4를 선언해서 각각 a,b,c,d를 가리키게 하자 그다음에 포인터 p1,p2,p3,p4를 이용해서 a,b,c,d의 값을 1 증가 시키자. 즉, 간접 접근 방식에 의해서 값을 하나 증가시키라는 뜻이다.
문제 3
int형 변수 a와 b를 선언과 동시에 각각 10,20으로 초기화시킨다. 그리고 포인터 p1, p2를 선언한 다음 각각 변수 a,b를 가리키게 한다. 그 다음 간접 접근 방식에 의해서 값을 하나 감소 시킨다. 그리고 p1,p2를 swap 시킨다.
이 글은 스프링노트에서 작성되었습니다.
'2. C/C++ > 01. C' 카테고리의 다른 글
17. 포인터의 포인터 (0) | 2008.12.07 |
---|---|
16. 다차원 배열 (0) | 2008.12.07 |
14. 포인터와 함수에 대한 이해 (0) | 2008.12.07 |
13. 포인터와 배열! 함께 이해하기 (0) | 2008.12.07 |
11. 1차원 배열 (0) | 2008.12.07 |