목록포인터 (11)

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

이중 포인터와 동적 다차원 배열 이전 포스팅에서 정적 배열을 이용해서 다차원 배열 만드는 것에 대해 포스팅했었다. 정적 다차원 배열 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 포인터에다가 주소를 넣는 것은 문제..

Member selection with pointers and references 포인터와 참조를 구조체(structure) 또는 클래스(class)에 대해서 사용할 때는 포인터와 참조를 통해서 구조체 또는 클래스의 멤버에 접근할 수 있다. 이 때 어떤 연산자를 사용하는지 설명드리겠다. 간단한 structure를 하나 만들어보자. 예를 들어 Person이 있으면 우리가 Person의 멤버 age에 접근할 때는 person하고 .을 찍었다. . 은 멤버 selection operator로 멤버를 선택하게 해주는 연산자이다. 나중에 멤버 function, class, 객체지향 배울때 유용하게 사용될 연산자이다. 이렇게 하는 방법이 한가지 있고 레퍼런스를 사용해서 접근하는 방법이 있다. 이때 ref에 .을 찍..

Reference to const value const 값에 대한 포인터를 선언하는 것처럼 const 값에 대한 참조를 선언할 수 있다. const 키워드를 사용하여 참조를 선언하면 된다. 예를 들어보자 변수 하나를 선언하고 다음으로 const를 붙여보자 이렇게 const를 붙인다면 ref_x의 값을 못 바꾼다. 반대로 그리고 int x에 const가 붙은 상태에서 밑에 const를 또 붙이는 것은 괜찮다. Initializing references to const values const 참조는 non-nonst 값, const 값 및 R-Value로 초기화할 수 있다. 다음으로 const int x 에서 const를 뗼 수 있다. const int &ref_x = x; 여기서 떼도 상수를 가리키는 포인..

참조형 변수 (Reference variable) 지금까지 두 가지 변수 타입을 공부했다. 일반 변수 : 직접 값을 보유 포인터 : 다른 값의 주소(또는 null)를 보유 참조형(reference)은 C++에서 지원하는 세 번째 변수 타입이다. 참조형은 다른 객체 또는 값의 별칭으로 사용되는 C++ 타입이다. C++은 세 가지 종류의 참조형을 지원한다. non-const 값 참조형 const 값 참조형 r-value 참조형 포인터를 사용하다 보면 * 을 붙여주는 게 조금 귀찮을 수 있다. de-referencing 할 때 일일이 *을 붙여줘야 하는데 조금 불편하다. 특정한 경우에 포인터보다 조금 사용하기 편한 게 있다. 그게 바로 참조 변수이다. 우리가 보통 포인터를 쓸 때에는 int value = 5;..

Pointing to const variables 일반 변수에 const를 사용해서 상수로 만들 수 있듯이 포인터에도 const를 사용할 수 있다. 그런데 일반변수와는 조금 다르다. 포인터와 const가 어떻게 사용되는지 설명드리겠다. 지금까지 보았던 모든 포인터는 상수(const)가 아닌 값을 가리키는 비-상수(non-const) 포인터다. 하지만 값이 상수인 경우에는 어떻게 될까? value에 const를 걸어보자. 위 코드는 컴파일되지 않는다. value가 const니까 포인터로 못 만드는 건가? 생각할 수 있지만 그렇지 않다. pointer도 const가 앞에 붙으면 할 수 있다. 상수 변수는 값을 변경할 수 없다. 만약 상수가 아닌 포인터가 상수 변수를 가리킨 다음에 역참조하여 값을 바꿀 수 있..

문자열 기호적 상수 (C-style string symbolic constants) 지난 포스팅에서 C 스타일 문자열을 만들고 초기화하는 방법에 대해 배웠다. 그렇다면 이전에 array 하고 포인터는 호환이 된다고 했으니까 이렇게 해도 될까? 왜냐하면 오른쪽에 있는 "Hyoni Hyoni"는 리터럴이고 왼쪽에 있는 것은 그냥 only 포인터다. 실제로 리터럴이 담길 메모리를 어디서 만들 것인가에 대한 아무런 정보가 없다. 포인터를 사용하실 때 주의해야 할 개념 중 하나이다. "Hyoni Hyoni"는 리터럴이라서 임시로 어딘가에 잠깐 담길 수는 있겠지만 이걸 배열에 담는 것도, 변수에 담는 것도 아니다. 포인터는 메모리의 주소만 가리키기만 하니까 포인터에도 담을 수 없다. 그럼에도 불구하고 "Hyoni ..

포인터의 연산과 배열 인덱싱 (Pointer Arithmetic and Array Indexing) C++ 언어를 사용하면 포인터에서 정수 추가 또는 빼기 작업을 수행할 수 있다. 만약 ptr이 정수를 가리키면 ptr+1 은 ptr 다음 메모리의 정수 주소가 된다. ptr-1 은 ptr 이전 정수의 주소다. ptr+1은 ptr 뒤 메모리 주소를 반환하지 않고 ptr이 가리키는 객체의 다음 메모리 주소를 반환한다. ptr이 정수 (4바이트라고 가정)를 가리키면, ptr+3은 ptr 이후에 3개의 정수(12바이트)를 의미한다. ptr이 항상 1바이트인 char을 가리키면, ptr+3은 ptr 이후에 3개의 문자(3바이트)를 의미한다.' 포인터 산술 표현식을 계산할 때 컴파일러는 항상 피연산자에 가리키고 있는..

Null values and Null pointers 일반 변수와 마찬가지로 포인터는 인스턴스화 될 때 초기화되지 않는다. 값이 할당되지 않으면 포인터는 기본적으로 어떤 쓰레기 주소를 가리킨다. 포인터의 위험성 중 쓰레기 주소 값이 들어간 경우, de-referencing을 시도하게 되면 실제 메모리에 데이터가 잘 담겨있는 것이 아니라서, 엉뚱한 곳에 가서 데이터를 찾기 때문에 OS가 문제가 있다고 경고한다고 앞 포스팅에서 말씀드렸다. 이런 문제를 방지하기 위해서 null pointer라는 것을 사용한다. 메모리 주소 외에도 포인터가 저장할 수 있는 값이 하나 있다. 바로 null 값이다. null 값은 포인터가 아무것도 가리키지 않는다는 것을 의미하는 특수 값이다. null값을 가진 포인터를 null ..