void 타입
리턴값이 없는 타입
리턴값이 없는 함수
- 반환값이 굳이 필요없는 함수는 리턴값이 없는 타입인 void를 이용할 수 있다.
Swap 함수 구현
#include <iostream>
using namespace std;
void swap(int*, int*);
int main() {
int a = 3;
int b = 7;
cout << "swap 이전 >> " << "a = " << a << ", " << "b = " << b << endl;
swap(&a, &b);
cout << "swap 이후 >> " << "a = " << a << ", " << "b = " << b << endl;
return 0;
}
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
swap 이전 >> a = 3, b = 7
swap 이후 >> a = 7, b = 3
- 반환값이 필요없는 함수는 void 타입을 이용한다.
void 포인터
void 변수는 생성 가능한가
- 결론부터 말하자면 불가능하다.
- void로 변수를 정의하면 변수의 타입을 알 수 없기 때문에 메모리를 얼마나 할당해야 할지 결정할 수 없다. ▶ 모든 변수는 컴파일 때 메모리 상의 위치가 결정되어야 함
#include <iostream>
using namespace std;
int main() {
void a;
return 0;
}
void 포인터는 생성 가능한가
- 반면 void 포인터는 생성할 수 있다.
- 포인터는 타입에 관계없이 메모리 상에 고정된 크기만큼 할당된다. ▶ 4bytes(32bit), 8bytes(64bit)
- void 포인터는 어떠한 형태의 포인터 값이라도 담을 수 있다. ▶ 주소값을 보관하는 역할만 함. 그러나 주소로부터 값을 읽지는 못한다.
Ex) 메모리 주소 확인
#include <iostream>
using namespace std;
int main() {
int num = 3;
void *a;
a = #
cout << &num << endl;
cout << a << endl;
return 0;
}
005CFAFC
005CFAFC
- 주소를 저장하는 것은 문제가 없다.
Ex) 주소를 통해 값 확인하기
#include <iostream>
using namespace std;
int main() {
int num = 3;
void *a;
a = #
cout << *a << endl;
return 0;
}
- void 포인터에 저장된 주소를 통해 값을 확인하려고 하면 오류가 발생한다.
- 왜냐하면 컴파일러가 *a가 무엇을 말하는지 알 수 없기 때문이다. ▶ 메모리 상에서 a부터(시작주소에서부터) 얼마만큼 읽어야 할지를 알 수 없음.
- 이런 경우에는 다음과 같이 타입을 명시해야 한다.
Ex) 주소를 통해 값 확인하기 (타입 명시)
#include <iostream>
using namespace std;
int main() {
int num = 3;
void *a;
a = #
cout << *(int *)a << endl;
return 0;
}
3
- void 포인터를 정수형 포인터로 형변환한다.
- (int *)은 컴파일러에게 a가 int를 가리키는 포인터임을 알려준다. ▶ 컴파일러가 시작주소에서부터 4byte만큼을 읽음
main 함수
- main 함수는 사실 인자를 갖고 있다.
int main(int argc, char **argv)
- argc - main 함수가 받은 인자의 수
- argv - main 함수가 받은 각각의 인자들
main 함수 인자 확인
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
cout << "받은 인자의 개수: " << argc << endl;
for (int i = 0; i < argc; i++) {
cout << "프로그램이 받은 인자: " << argv[i] << endl;
}
return 0;
}
받은 인자의 개수: 1
프로그램이 받은 인자: C:\Users\*****\source\repos\Project5\Debug\Project5.exe
- 기본적으로 main 함수는 파일의 실행경로를 인자로 받고 있음을 알 수 있다.