💻프로그래밍 내용 정리

    [C++ 7.3.1] 포인터 연산

    포인터 연산 C++ 컴파일러는 포인터 연산할 때 포인터에 선언된 타입을 이용한다. 포인터를 int로 선언하고 그 값을 1만큼 증가하면 포인터는 메모리에서 한 바이트가 아닌 int 크기만큼 이동한다. 이 연산은 주로 배열을 다루는 데 유용하다. 배열에 담긴 데이터는 모두 타입이 같을 뿐만 아니라 메모리에 연속적으로 저장돼 있기 때문이다. 다음은 int 타입의 힙 배열을 선언한 경우이다. int* myArray = new int[8]; 이 배열의 인덱스 2에 해당하는 지점에 값을 넣는 방법은 이미 잘 알 것이다. myArray[2] = 33; 위 코드를 포인터 연산으로도 표현할 수 있다. 다시 말해 myArray가 시작하는 시점에서 int 값이 담긴 칸을 두 번 건너서 거기 값을 역참조하면 된다. *(myA..

    [C++ 7.2.2] 포인터와 배열2

    포인터가 모두 배열은 아니다. 앞 절의 doubleInts()처럼 함수를 호출할 때 포인터 자리에 배열을 넣어도 된다고 해서 포인터가 배열과 같다고 생각하면 안된다. 포인터와 배열은 비슷한 점이 많아서 앞에서 본 예제처럼 서로 바꿔 써도 되지만 그렇다고 똑같지 않다. 포인터 자체는 의미가 없다. 임의의 메모리를 가리킬 수도 있고 객체나 배열을 가리킬 수도 있다. 언제든지 포인터에 배열 문법을 적용해도 되지만 실제로 포인터가 배열은 아니기 때문에 부적절한 경우도 있다. int* ptr = new int; ptr이란 포인터는 정상적인 포인터지만 배열은 아니다. 이 포인터가 가리키는 값을 배열 문법(ptr[0])으로 표현할 수는 있지만 바람직한 방법도 아니고 장점도 없다. 실수로 ptr[1]이라고 작성했다가 ..

    [C++ 7.2.1] 배열과 포인터

    배열과 포인터 배열과 포인터는 서로 비슷하다. 힙에 할당된 배열은 첫 번째 원소를 가리키는 포인터를 참조한다. 스택에 할당된 배열은 배열 문법'[ ]'으로 참조한다. 배열 = 포인터 스택 배열에 접근할 때도 포인터를 이용할 수 있다. 배열의 주소는 인덱스가 0인 첫 번째 원소에 대한 주소이다. 컴파일러는 배열의 첫 번째 원소에 대한 주소만 가리킨다. 그래서 힙 배열과 똑같은 방식으로 포인터를 사용할 수 있다. 다음 코드는 0으로 초기화한 스택 배열을 만들고 포인터로 접근하는 예이다. int myIntArray[10]; int* myIntPtr = myIntArray; // 포인터로 배열 접근하기 myIntptr[4] = 5; 스택 배열을 포인터로 접근하는 기능은 배열을 함수에 넘길 때 특히 유용하다. 다..

    [C++ 7.1.4] 포인터 다루기

    [C++ 7.1.4] 포인터 다루기

    포인터 다루기 포인터는 단지 메모리 주소이기 때문에 이론상 그 주소를 얼마든지 변경할 수 있고, 다음과 같이 위험한 일도 할 수 있다. char* scaryPointer = (char*)7; 이 코드는 메모리 주소 7에 대한 포인터를 만든다. 이 포인터는 어떤 값을 가리키거나 다른 영역에서 사용하는 공간일 가능성이 높다. new를 호출하거나 스택에 생성된 것처럼 별도로 할당된 영역이 아닌 메모리 공간을 사용하면 객체를 저장하거나 힙으로 관리하는 메모리가 손상돼 프로그램이 제대로 작동하지 않을 수 있다. 1. 포인터의 작동 방식 포인터는 두가지 관점으로 볼 수 있다. 첫 번째는 포인터를 주소로 보는 관점이다. 포인터는 메모리를 알 수 없는 방식으로 돌아다니는 통로가 아니다. 메모리의 한 지점을 가리키는 숫..

    [C++ 7.1.3-2] 다차원 배열

    [C++ 7.1.3-2] 다차원 배열

    다차원 배열 다차원 배열이란 여러 개의 인덱스 값을 사용하도록 일차원 배열을 확장한 것이다. 예를 들어 틱택토 게임을 만들 때 3 x 3 격자를 이차원 배열로 구현할 수 있다. 다음 코드는 배열을 스택에 생성하고 0으로 초기화한 뒤 테스트 코드로 접근하는 예이다. char board[3][3] = {}; // 텍스트 코드 board[0][0] = 'X'; // (0,0) 지점에 X를 둔다. board[2][1] = 'O'; // (2,1) 지점에 O를 둔다. 여기서 첫 번째 인덱스가 x축을 가리키는지 아니면 y축을 가리키는지 헷갈릴 수 있다. 대부분 이해하기 쉽도록 첫 번째 인덱스를 x축으로, 두 번째 인덱스를 y축으로 사용한다. 다차원 스택 배열 스택에 생성한 이차원 배열의 메모리 상태는 다음과 같다...

    [C++ 7.1.3-1] 배열, 객체 배열, 배열 삭제

    [C++ 7.1.3-1] 배열, 객체 배열, 배열 삭제

    배열은 서로 타입이 같은 원소들을 변수 하나에 담아서 각 원소를 인덱스로 접근하게 해준다. 1. 기본 타입 배열 배열에 대한 메모리를 할당하면 실제 메모리에서도 연속된 공간을 할당한다. 이때 메모리의 한 칸은 배열의 한 원소를 담을 수 있는 크기로 할당된다. 예를 들어 다섯 개의 int 값으로 구성된 배열을 다음과 같이 로컬 변수로 선언하면 스택에 메모리가 할당된다 int myArray[5]; 다음은 이 배열을 생성한 직후의 메모리 상태를 보여준다. 이때 스택에 생성한 배열의 크기가 컴파일 시간에 결정되도록 상숫값으로 지정해야 한다. 배열을 힙에 선언할 때도 비슷하다. 배열의 위치를 가리키는 포인터를 사용한다는 점만 다르다. 다음은 int 값 다섯 개를 담는 배열에 메모리를 할당해서 그 공간을 가리키는 ..