12. 포인터의 이해

I. 포인터란 무엇인가?

  • 포인터란 메모리의 주소 값을 저장하기 위한 변수이다.
  • 포인터는 타입에 상관없이 그 크기가 4바이트임을 알 수 있다.

pointer.jpg 

  • 포인터 선언하기

    1. int n = 7;
    2. int *pN = n;
  • 주소와 관련된 연산자 : &연산자, *연산자

    • 주소값을 참조할 때 사용하는 연산자 : &
    • 포인터가 가리키는 메모리 참조 : *
    1. int main()
    2. {

      1. int a =2005;
      2. int *pA = &a;
      3. printf("%d",pA);
      4. printf("%d,*pA);
    3. }
    • *pA는 2005로 출력된다.
    • pA는 a의 주소값이 들어가 있다.
    • 포인터에 대한 예제
    1. #include<stdio.h>
    2. int main(void)
    3. {

      1. int a = 2005;
      2. int *pA = &a;
      3. printf("pA : %d\n",pA);
      4. printf("&a : %d\n",&a); //직접 접근
      5. (*pA)++;
      6. printf("a: %d\n",a);
      7. printf("*pA: %d\n",*pA); //간접 접근
      8. return 0;
    4. }
  • 실행 시키면 어떤식으로 돌아가는지 이해 할 것이다.
  • 포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 한다.

    • 포인터 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

다음 프로그램 실행 시 포인터와 변수와의 관계를 나름대로 그림을 그려서 설명해 보자, 출력 결과도 예상해 보자

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n = 10;

  5. int *p1 = &n;

  6. int *p2 = p1;

  7. printf("%d\n",(*p1)++);

  8. printf(%d\n",(*p2)++);

  9. printf("%d\n",n);

  10. return 0;

  11. }

 

문제 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
Posted by kid1412
,