ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C/C++] 포인터
    기초/C,C++ 2017. 2. 28. 09:50

    포 인 터

     

    [장점]

    연결리스트, 이진트리등의 상향된 자료구조 구축 가능

    참조에 의한 호출(call by reference)

    동적메모리 할당


    자바의 꽃은 상속이지만

    C언어의 꽃은 포인터 입니다.

     

    포인터를 사용하는 목적은 컴파일시 자동적으로 부여되는 변수의 주소값을 컨트롤하기 위함입니다.

    그래서 포인터변수에는 주소값(&)만 넣을 수 있습니다.

     

    저희는 &기호를 한번 써 본적이 있습니다.

    int num = 0;

    이 선언 되었을때

     scanf("%d",&num);

     

    &num의 의미가 num의 주소값을 가르키는 의미였습니다

    &은 주소값을 가르키는 기호입니다

     

    !!!!!!!!!!!중요!!!!!!!!!

    포인터 변수는 반드시 초기화를 해야합니다.

    포인터 변수를 초기화 하지 않고 사용한 경우

    쓰레기값의 주소값이 들어가는데 그떄

    쓰레기값의 주소에 들어있는 값이 중요데이터(부팅, 사용자정보)일 경우

    그대로 다른 컴퓨터 준비해주시면 될 것 같습니다!

    따라서 반드시 "초기화"를 해주셔야 합니다.

     

     

    [사용법]

    #1) int* pNum = #

    정수를 가리키는 주소값

    메모리 가리키기

    (선언)

    단순히 메모리의 주소 맨 앞을 가리킵니다

    이유는 메모리 주소값이 4byte로 범위가 있는데 제일 작은 맨앞의 메모리 주소를 가르키는 겁니다!

     

    #2) *pNum = 30;

    메모리에 접근해서 데이터 바꾸기!

    메모리 공간에 접근해서 데이터를 변경하려고 하는 경우

    포인터 변수명 앞에 *기호를 사용해서 접근합니다.

    이렇게 값을 바꾸면

    pNum이 가르키는 주소 num의 값이 바뀌게 되는겁니다.

     

    * 기호는 곱셈의 역할을 했지만 포인터에서는 2가지 의미로 사용됩니다.

    #1 포인터형 선언

    #2 메모리 접근

     

    변수타입앞에 *(애스크립트?) 기호를 붙였을 경우

    메모리 주소값만 들어 갈 수 있습니다.

     

    주소값은 정수형인데 왜 int타입으로 선언 하냐구요?

    저희는 단순히 주소값만 지정하는 변수로 포인터를 사용하려고 했던거면

    그냥 &num으로 계속 사용하면 된다고 생각합니다.

     

    저희는 "데이터"값을 컨트롤 하기 위함이라고 했습니다.

    저희는 포인터사용 목적을 포인터 변수를 사용해서 메모리공간에 접근해서 정보를 바꾸기 위해 사용합니다.

    그렇기 위해서 메모리주소에 있는 값과 같은 형의 포인트 형을 변수타입으로 지정해주는 겁니다.

     

    정리하자면

    포인터 변수형타입은 메모리공간에 들어있는 값을 제어하기 위함이다.

    num = 17인경우 char, int ,short ...다양한 변수형 타입이 올수 있기 때문에

    컴퓨터가 알아듣지 못한다.

     

    포인터형 타입의 의미는 : 변수의 데이터 정보, 주소값이다.

    포인터는 주소값을 담을때 주소값의 변수 타입과 같아야 한다.

    주소값의 데이터에 접근을 할 때는 *기호를 붙여서 접근한다.

     

    함수에 포인터를 사용하면 왜 편리한가?

     

    포인터는 메모리 접근이라고 했습니다.

    따라서 주소값이 파라매터로 넘어가서 함수에서 데이터 처리를 하면

    주소값이 변경되었기 때문에 return값을 넘겨줄 필요가 없습니다.


    #포인터 선언 방법

    변수 하나를 선언하고 변수의 주소로 포인터 변수를 초기화한다.


    #2 포인터변수도 연산할 수 있을까?

    포인터에 연산을 시작하면 자료형 크기가 연산됩니다.

    덧셈과 뺄셈만 가능합니다.



    #3 주소값의 좋은점

    여러개의 값을 변경하고 싶은 함수를 만들 때 

    return값은 여러개의 값을 바꾸려면 전역변수를 만들어야되지만

    주소값을 사용하면 값자체도 바꿀수 있기 때문에 사용하면 편리하다.


     

     


    '기초 > C,C++' 카테고리의 다른 글

    [C/C++] 반환 형식 ,Call by ~  (0) 2017.03.02
    [C,C++] 포인터와 배열  (0) 2017.03.02
    [C/C++] 문자열 라이브러리 함수  (0) 2017.02.27
    [C/C++] 키워드  (2) 2017.02.24
    [C/C++] <Windows.h>  (0) 2017.02.24

    댓글

Designed by Tistory.