본 내용은 어소트락 무료 강의 <C/C++ 무료강의>을 기반으로 공부한 내용을 정리한 것이다. 틀린 내용이 있을 수도 있음.

Void

어떤 함수가 반환할게 없을 때 반환타입으로 Void를 사용함. 즉 return = 0; 으로 리턴값이 필요로 하지 않는다.

void Func()
{
    int a = 0;
                    // return 값이 없다 => 스택 호출 과정에서 리턴해주지 않는다!
}

Void 포인터 (void*)

포인터 앞에 쓰이는 자료형에 대해 생각해보자.

본래 포인터의 개념을 생각해보면 이해가 잘 될것이다.

float* pFloat = nullptr;    -> 역참조의 단위. float 원본을 보겠다.

예시 코드의 float는 해당 포인터 변수가 주소값을 참조할 때 float 자료형으로 해석할 것인지를 알려준다.

이 원리를 void 포인터에 적용하면 다음과 같이 된다.

void* pVoid = nullptr;  // -> 포인터 앞 void? -> 원본의 형태를 어떻게 본다는 것을 정하지 않은 것!! 역참조의 단위가 없다는 뜻 => 어떤 변수의 주소든 다 받을 수 있다.
{
    int a = 0;
    float f = 0.f;
    double d = 0.;
    long long ll = 0;

    pVoid = &a;
    pVoid = &f;
    pVoid = &d;
    pVoid = &ll;            // --> 어떤 자료형이든 다 받을 수 있다. 역참조가 불가능 하다.
}

따라서 void 포인터는 접근한 주소값을 특정 자료형이 아니라 어떤 자료형이든 다 받을 수 있게끔 하는 기능을 가지고 있다. 단, 역참조는 불가능하다.

void 포인터 특징

  • 아무 자료형 변수를 다 받을 수 있음
  • 역참조 불가능 (일반 포인터처럼 해석하려는 자료형이 정해지지 않았기 때문)
  • 주소 연산 또한 불가능

    ex)

    ex) pVoid + 1; // => 몇 바이트를 더해야되는 지 모름! 계산 불가
    

    정리하자면,

  1. 원본의 자료형을 정하지 않음
  2. 어떠한 타입의 변수의 주소든 다 저장 가능
  3. 역참조 불가능
  4. 주소 연산 불가능

이후 동적할당을 배울 때 이 개념이 중요하다.

문자

메모리 영역에는 1. 스택 영역 2. 데이터 영역 3. 힙 영역 4. ROM (코드) 이렇게 4가지가 있다고 배웠다.

이번에는 4. 코드에 대해 이야기를 하려면 문자에 대해 알아야 함

char c = 0;             // 사이즈 : 1 Byte 표현법 : 정수형태

char는 일반적으로 문자를 표현하는데 특화되어 있다. char와 비슷하게 문자를 표현할 수 있는 자료형이 이전에 배운 bool 자료형이다.

그 중 char가 문자를 표현하는 데 있어 특화된 이유는 char가 숫자에 대응하는 문자도 같이 표현이 되기 때문이다. (Boolean과 표현이 다름)

char a = 1;             //      1, 1
bool a = 1;             //      True

char는 1 Byte 자료형이다. 그렇다면 더 큰 Byte를 요구하면 어떡하지?

그래서 2 Byte 자료형인 wchar_t가 존재한다.

whcar_t wc = 49;        //  -> 49 , "1"-> "아스키 코드" 참조
short s = 49;       

1; 과 ‘1’; 은 다르다!!

char c = 1; 정수 1 대입
c = '1';    문자 '1' 대입 -> 완전히 다르게 보아라

문자열

이런 문자들이 나열되어있는 문자열이 있다.

wc = 459;
"459";  52, 53 ,57          // -> 한 3byte만 있으면 될듯? 접근방식자체가 다르다! 

문자열 구동 방식

단순하게 문자를 나열해버리면 다음칸에도 문자가 있을거라고 해석하지 않을까? 끝을 알수가 없으니까. 규칙이 있어야만 한다.

가령 1 바이트를 읽기 시작해서 이어나가며 쭉쭉가는데 끝이 없으면? 끝이 있다고 알려주는 장치가 있어야 끊지 않을까?

그래서 마지막에 0을 넣어준다. 마침표느낌이라고 생각하자.

그 0에 대응하는 문자가 있지 않을까? 그게 바로 아스키 코드에서의 “NUL” 문자이다.

주의! : 공백 문자 SP랑 헷갈리지 마라!

스페이스로 공백을 띄워도 아무것도 없는게 아니라 32라는 정수가 들어있음. 문자열이 이어나가면서 32라는 숫자를 만나면 한번 띄어쓰기를 한다.

ex : “4 59”; 메모리에 1바이트 단위로 들어감.

“52, 32, 53, 59 0” 가 들어가있음.

32가 들어간 곳은 스페이스바로 띄어쓰기가 된거임. 0을 만나고 종료가 되는 구조.

다음에는 이제 char를 배열로 선언해서 문자열을 담아보자.