목록전체 글 (70)

주소에 의한 인수 전달 (Call by Address) 함수에 변수를 전달할 수 있는 또 다른 방법이 있는데, 주소를 사용하는 것이다. 인수가 주소이기 때문에 함수 매개 변수는 포인터다. 함수는 가리키는 값에 접근하거나 변경하기 위해 포인터를 역참조 할 수 있다. 간단한 예제로 살펴보자 이번에는 파라미터가 포인터다! main에서 함수를 호출할 때 그냥 value를 넣으면 오류난다. 주소를 보내주어야 하기 때문이다. 그러니까 포인터를 하나 선언하는 방법이 있다. 그리고 한 가지 더 보여드리자면 리터럴이라서 주소가 없기 때문이다. 혹시나 const로 바꾸면 될까? 생각할 수 있다. 그냥 주소만 넣어주어야 하는 것이다. 그다음 함수 안에서 ptr을 de-referencing 한 것도 찍어보고 ptr도 찍어보고..

참조에 의한 인수 전달 (Call by Reference) 값으로 전달은 두 가지 한계가 있다. 첫째, 큰 구조체 또는 클래스를 함수에 전달할 때 값으로 전달은 인수의 복사본을 함수 매개 변수로 만든다. 이 경우 복사하는데 큰 비용이 들어 성능이 저하될 수 있다. 둘째, 값으로 인수를 전달할 경우 함수에서 호출자에게 값을 반환하는 유일한 방법은 함수의 반환 값을 사용하는 것이다. 이 방법도 좋지만, 함수에서 인수를 수정하는 것이 더 명확하고 효율적일 수 있다. 참조를 통해 위 두 가지 문제를 해결할 수 있다. 참조의 의한 인수 전달은 call by reference라고 부른다. 오픈 소스에 많이 등장하니까 주의깊에 봐 두면 좋다. 간단한 함수를 먼저 정의해보자. 변수를 참조로 전달하려면 함수 매개 변수를..

값에 의한 인수 전달 (Passing Arguments by Value (Call by Value)) C++에서 포인터가 아닌 인수는 값으로 전달된다. 인수가 값으로 전달되면 인수의 값은 해당 함수 매개 변수의 값으로 복사된다. doSomething함수가 있고 int y가 매개변수로 정의되어 있다. 이 함수는 y에 어떤 값이 들어오냐에 따라 실행하는 내용과 결과가 달라질 수 있다. doSomething(5) 호출에서 인수는 리터럴 5다. doSomething(5)가 호출되면 변수 y가 만들어지고 값 5가 y로 복사가 되어서 초기화된다. 변수 y는 doSomething( ) 함수가 종료되면 소멸한다. 다음으로 doSomething(x) 호출에서 인수는 변수 x다. x는 값 6으로 평가된다. 두 번째 호출에..

매개변수와 실인자의 구분 (Parameters and Arguments) 큰 프로그램을 만들 때 함수를 잘 사용하는 것은 중요한 일이다. 함수를 정확하게 이해하기 위해서 매개변수 Parameter와 인자 Argument 이 두 용어를 정확하게 구분 짓고 넘어가겠다. 매개변수(Function parameter) 매개변수(Function parameter)는 함수에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수를 의미한다. 즉, 매개변수는 함수 선언에 선언된 변수다. 여기 foo 라는 함수의 prototype(원형)이 있다. 정수형 변수 int x와 int y가 foo 함수의 파라미터이다. 이렇게 선언을 해주는 것이다. foo 앞에 int는 return 타입이 int라는 뜻이다. 여기는 함수의 ..

std::vector 이전 포스팅에서 std::array를 소개했다. std::array는 C++의 내장 고정 배열(fixed array) 기능을 더 안전하고 유용한 형태로 제공한다. 마찬가지로 C++ 표준 라이브러리에는 동적 배열(dynamic array) 작업을 더 안전하고 쉽게 해주는 std::vector를 제공한다. An introduction to std::vector std::vector는 자체 메모리 관리를 처리하는 동적 배열 기능을 제공한다. 즉, new와 delete를 사용하여 메모리를 동적으로 할당, 해제하지 않아도 런타임에 길이가 설정된 배열을 만들 수 있다. std::vector는 헤더에 정의되어 있다. std::vector 변수 선언은 쉽다. 초기화 하는 방법을 살펴보자 std::..

std::array 이전 포스트들에서 고정 배열(fixed array)과 동적 배열(dynamic array)을 배웠다. 두 가지 배열 모두 C++에 내장되어 있지만, 포인터로 형 변환되었을 시 배열 길이 정보가 손실되고, 동적 배열은 지저분한 할당 해제 문제가 있다. 이러한 문제를 해결하기 위해 C++ 표준 라이브러리는 배열 관리를 쉽게 해주는 std::array와 std::vector가 있다. An introduction to std::array in C++11 C++ 11에서 소개된 std::array는 함수에 전달할 때 포인터로 형 변환되지 않는 고정 길이 배열이다. std::array는 헤더의 std namespace 내부에 정의되어 있다. array를 선언할 때 std::array 변수 선언은..

이중 포인터와 동적 다차원 배열 이전 포스팅에서 정적 배열을 이용해서 다차원 배열 만드는 것에 대해 포스팅했었다. 정적 다차원 배열 Multidimensional Arrays 다차원 배열 (Multidimensional Arrays) 컴퓨터 속에 메모리는 1차원적인 주소 공간을 가지고 있다. 단독주택 여러 개가 일렬로 늘어져 있는 형태를 생각하면 된다. 하지만 프로그래밍을 하다 보면 아파 hyoniidaaa.tistory.com 이번에는 동적 메모리 할당을 통해서 다차원 배열을 만드는 방법에 대해 설명하겠다. (+ 이중포인터를 사용하는 방법, 사용하지 않는 방법 포함) 포인터 변수는 이렇게 선언할 수 있다. 포인터도 변수다. 그러니까 포인터에 대한 포인터도 만들 수 있다. 그걸 보통 이중포인터라고 부른다..

void pointer void pointer는 모든 데이터 자료형을 가리킬 수 있는 특별한 타입의 포인터이다. 제네릭 포인터(generic pointer)라고도 불린다. generic이란 포괄적이다 라는 뜻을 가지고 있다. void 포인터는 void 키워드를 사용하여 일반 포인터처럼 선언한다. void* ptr; //ptr is a void pointer void 포인터는 모든 데이터 자료형의 객체를 가리킬 수 있다. 예를 들어보자 int, float, char 한 개씩 선언하고 void 포인터를 일단 nullptr로 초기화를 했고 void pointer에 int, float, char 타입의 주소도 넣어봤는데 문제가 없다. just 주소 그 자체이기 때문에 void 포인터에다가 주소를 넣는 것은 문제..