wn42
코딩이랑 이것저것
wn42
전체 방문자
오늘
어제
  • 분류 전체보기 (113)
    • 프로그래머스 (23)
      • LV1 (11)
      • LV2 (1)
      • LV3 (3)
      • 연습 (8)
    • 딥러닝 공부 (0)
      • 머신러닝&딥러닝 이론 (0)
    • 임베디드 (17)
      • Adventure Design (1)
      • 센서기반모바일로봇 (5)
      • ROS (9)
      • Google Coral (2)
    • C++ (38)
      • C++ 기초 (34)
      • 자료구조 및 알고리즘 (4)
    • Python (14)
      • 기본 파이썬 문법 (6)
      • Python 기초 (8)
    • 빅데이터 (9)
      • 빅데이터 첫걸음 시작하기(국비지원) (5)
      • 빅데이터 공부 (4)
    • 알고리즘 공부 (2)
      • 기본 알고리즘 (2)
    • 전자공학 (10)
      • 반도체 공정 (3)
      • 무선데이터통신 (7)
      • 반도체공학 (0)
    • C# (0)
      • C# 기본 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 큐
  • 조건문
  • 데이터분석 인강
  • 파이썬
  • 빅데이터
  • c++
  • ROS
  • 소멸자
  • 스택/큐
  • Queue
  • stl
  • 내일배움카드
  • 바이트디그리
  • 프로그래머스
  • 클래스
  • 반복문
  • 패스트캠퍼스
  • google coral
  • 변수
  • 노드
  • 스택
  • 인스턴스
  • 딥러닝
  • K디지털크레딧
  • numpy
  • 데이터분석
  • 빅데이터 첫걸음 시작하기
  • 정렬
  • Python
  • 상속

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
wn42

코딩이랑 이것저것

C++/C++ 기초

[C++] void 타입 / main 함수

2022. 12. 29. 15:46

 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 = &num;

	cout << &num << endl;
	cout << a << endl;

	return 0;
}
005CFAFC
005CFAFC
  • 주소를 저장하는 것은 문제가 없다.

 

Ex) 주소를 통해 값 확인하기

#include <iostream>
using namespace std;

int main() {
	int num = 3;
	void *a;
	a = &num;

	cout << *a << endl;

	return 0;
}

  • void 포인터에 저장된 주소를 통해 값을 확인하려고 하면 오류가 발생한다.
  • 왜냐하면 컴파일러가 *a가 무엇을 말하는지 알 수 없기 때문이다. ▶ 메모리 상에서 a부터(시작주소에서부터) 얼마만큼 읽어야 할지를 알 수 없음.
  • 이런 경우에는 다음과 같이 타입을 명시해야 한다.

 

Ex) 주소를 통해 값 확인하기 (타입 명시)

#include <iostream>
using namespace std;

int main() {
	int num = 3;
	void *a;
	a = &num;

	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 함수는 파일의 실행경로를 인자로 받고 있음을 알 수 있다.

 

 

    'C++/C++ 기초' 카테고리의 다른 글
    • [C++] 레퍼런스(참조자)
    • [C++] 매크로 / 인라인
    • [C++] 변수 이해하기 (지역/전역/정적)
    • [C++] 열거형(Enum)
    wn42
    wn42
    코딩이랑 이것저것 하는 블로그

    티스토리툴바