반응형

1. 부정인수 : 인수의 개수가 정해지지 않은 인수

   메인함수에서 func() 라는 함수를 호출할때 굳이 인수를 넘겨주지 않아도
   부정인수에서 기본적으로 정해진 값이 들어가게 된다.
   이 부정인수를 사용하기 위해서 #include<stdarg.h> 라는 헤더파일을 추가해야한다.
   단, 주소는 전달하지 못하고 값만 전달할 수 있다. char, float형식은 사용할 수 없다.

     (1) va_arg()
       - 매개변수 : va_list 변수, 형(type)
       - 부정인수들은 매개변수에 대응시키고, 부정인수가 갖는 형으로 변환,
         (char, unsigned char, float형으로는 전환되지 않음)

     (2) va_list
       - 변수명 지정
       - 매개변수에 의해 부정인수의 수를 갖는다.

     (3) va_end()
       - 매개변수 : va_list 변수
       - 부정인수들을 대응시키고 인수의 수를 제거한다.

     (4) va_start()
       - 매개변수: va_list 변수
       - 매개변수를 초기화하고 부정인수의 위치를 알려준다.

사용자 삽입 이미지



2. 포인터

     (1) 참조자(Reference)
       포인터는 주소를 저장하고 그 주소를 역참조해서 값을 변경하여 여러번
       왔다갔다하는 오버헤드를 발생한다.
       그러한 포인터의 성능개선을 위해 등장한것이 참조자다.

----------(포인터연산)--
int i = 10;
int *p;
p = &i;
*p = 100

결과값 : 100
-----------------------
----------(참조자연산)--
int i = 10;
int &p = i; // i의 주소에 p도 같이 쓰는것을 의미
 // 바로 그 위치를 참조함으로써 왔다갔다하는 오버헤드를 줄이며
 // *같은 표식을 안해줌으로써 좀 더 간결할 수 있다.
p = 100;
-----------------------

사용자 삽입 이미지

       1) 포인터와 참조자의 차이점
          가. 포인터
             가) 선언과 초기화를 따로한다.
             나) 주소변경 가능
          나. 참조자
             가) 선언과 동시에 초기화
             나) 주소변경 불가능(주소를 변경해야하는 일이 생기면 포인터를 써야한다.)

     (2) Pointer와 const의 관계
       1) 포인터에 대한 상수
           const char *str = "C++ Programming";
             str[0] = 'A'; //오류
             str = "OOP Programming";  //가능
           const가 가리키고 있는것은 *str의 * 즉 값을 상수로 하겠다는 것이기 때문에
           값을 변경하려고 하면 오류가 난다.
           그러나 주소에 대해 const 한것은 아니기때문에 주소를 바꾸는것은 가능하다.

사용자 삽입 이미지

       2) 포인터상수
           char * const str = "C++ Programming";
             str[0] = 'A'; //가능
             str = "OOP Programming";  //오류
            이번엔 const가 가리키고 있는것이 str 이므로 값은 변경가능해지지만
            반대로 주소를 변경하는것은 오류가 난다.

사용자 삽입 이미지

       3) 상수에 대한 포인터 상수(1번과 2번을 합친것)
           const char * const str = "C++ Programming";
             str[0] = 'A'; //오류
             str = "OOP Programming";  //오류
            const가 *과 str 모두 가리키고 있어서 값과 주소 모두 바꿀수 없는 경우다.

     (3) 메모리할당
       1) new : 메모리 할당
          int *p = new int;  // 4바이트 만큼 메모리 할당
          int *p = new int[10]; // int가 10개 40바이트 만큼 메모리 할당
          int *p = new int(0);      // 4바이트만큼 메모리 할당하고 0으로 초기화
       2) delete : 메모리 해제
          delete p;
          단, 배열일경우(int *p = new int[10];) 이럴땐
          delete p; 할 경우 0번째인것은 해제 되지만 나머지 9개는 해제되지 않음
          그래서 delete []p; 이렇게 해제를 해야만 10개 모두 초기화가 된다.

사용자 삽입 이미지

반응형

+ Recent posts