목록c++ 정리 (12)
zyeon's 작심삼일 코딩 공부
함수도 메모리의 특정 주소에 저장되며, 이 주소를 함수 포인터에 저장할 수 있다.return_type (*pointer_name)(parameter_types);함수 포인터는 형태(반환형, 매개변수)가 맞는 함수의 주소를 받아 올 수 있다.위와 같은 형태로 선언 해 사용한다.함수 포인터를 사용하는 이유는 무엇일까? 상황이나 조건에 따라 호출하고 싶은 함수를 결정할 수 있기 때문에,함수 포인터는 콜백 함수로 자주 사용되며, 함수 테이블에서 인덱스에 따라 다양한 함수를 호출하는 경우에도 사용한다. #include int add(int a, int b) { return a + b;}int subtract(int a, int b) { return a - b;}int main() { int (*o..
new도 malloc과 같이 메모리를 동적 할당하는데 사용한다.따라서 malloc과 같이 힙 메모리 영역을 사용하고, 사용 후 할당을 해제해줘야 한다. 그렇다면 둘은 무슨 차이가 있을까?메모리 할당 방식int* m = (int*)malloc(sizeof(int) * 10); // malloc 메모리 할당int* n = new int[10]; // new 메모리 할당malloc은 void* 타입이므로, 사용할 때 캐스팅을 해줘야 한다.하지만 new는 별도의 캐스팅이 필요하지 않다.초기화int* a = new int; // 단순 메모리 할당int* b = new int(10); // 10으로 초기화한 객체 생성MyClass* c = new MyC..
정적 메모리 할당프로그램이 시작 되기 전 미리 정해진 크기의 메모리를 할당 받는다.프로그램 실행 도중 크기가 변경 될 수 없으며, 메모리 공간이 낭비될 수 있다. 동적 메모리 할당프로그램이 실행 도중에 동적으로 메모리를 할당 받으며, 이는 히프(heap) 메모리 공간에서 할당을 받는다.메모리를 효율적으로 관리 할 수 있으나 사용 후 메모리를 반납해 줘야한다.malloc()malloc 함수는 사용자가 지정한 크기만큼 메모리를 할당 한 후 메모리의 주소를 반환한다.이 때 주소는 void * 로 반환하여 사용자가 원하는 포인터 타입으로 지정해 사용할 수 있다. 또, 메모리를 할당하는 크기의 단위는 바이트이다.메모리가 부족할 시에는 NULL을 반환하며, 실행 시간 단축을 위해 초기화를 안한다는 특징을 가지고 있..
char문자 자료형 char은 아스키코드에 대응하는 문자를 저장하며, 1바이트 크기를 가지고 있다.char은 -128 ~ 127을 나타낼 수 있지만 아스키코드는 0 ~ 127에 대응하는 문자만을 가지고 있는데,아스키코드 범위를 제외한 수는 정수로써만 표현이 된다. 그럼 한글과 같은 문자는 어떻게 저장할까?한글의 조합 수를 생각해보면 8비트만으로 모든 한글을 대응하긴 힘든 것을 알 수 있다.따라서 비주얼스튜디오 기준으로 한글은 2바이트 크기로 나타낸다.char s[10] = "abc한글";int sLen = strlen(s); // 7 출력위 코드처럼 문자열에 저장을 하게 되면 '한'과 '글'은 1바이트 크기의 인덱스를 2개 사용하게 된다.우리는 다섯 글자를 썼다고 생각하지만 실제론 일곱 글자를 사..
포인터를 선언할 때 구체적인 대상물이 정해져있지 않았다면 void 포인터를 사용할 수 있다.void 포인터는 메모리의 주소만을 가지고있는 변수를 말하며, 제네릭 포인터 라고도 한다. void 포인터는 가리키는 대상의 자료형이 정해져있지 않기 때문에 *연산자를 사용할 수 없지만, 명시적인 대상을 가리키는 포인터 타입으로 형변환을 하면 사용 가능하다. 마찬가지로 void 포인터는 주소값을 얼마나 더하고 빼야하는지 모르기 때문에 주소 연산을 수행할 수 없지만, 형변환을 하여 사용이 가능하다.void *p = nullptr;int a = 10;p= &a;//printf("*p = %d", *p); //오류, 역참조 불가printf("*(int *)p = %d", *(int *)p); ..
const변수를 상수화 하는 것을 기호 상수라고 한다. 변수 앞에 const를 붙이면 상수화 되며, 변수 선언 시 반드시 초기화 해주어야 한다. 이후에 다른 값을 대입할 수 없지만, 예외로 클래스 생성자 호출 시에는 한 번 초기화 할 수 있다.const double TAX_RATE = 0.33; //상수화int income = 300000;income = income - TAX_RATE * income; 위 코드에서는 TAX_RATE를 상수화 하였다. 그렇다면 왜 상수 값을 그대로 사용하지 않고, 기호 상수를 사용하는 이유는 무엇일까?우선, 기호 상수를 사용하면 코드를 작성한 사람의 의도를 읽기 쉬워지며 가독성이 좋아진다. 또한 동일한 상수를 여러 곳에서 사용하고 있을 때, 상수 값을 일일..
배열은 포인터와 밀접한 관계를 가지고 있다. 우선 배열의 이름은 포인터이다. 배열의 이름은 배열의 시작 주소와 같다는 말이다. 또한 배열의 요소들은 메모리에서 연속된 공간을 차지한다. int형 배열의 요소들의 주소를 출력해보면, 4바이트 크기 차이를 가진 연속된 주소값을 가진다. int arr[] = {10, 20, 30}; 위와 같은 배열이 존재할 때, &arr[i] 와 arr+i 는 동일한 주소값을 가지며 arr[i]는 *(arr+i) 와 동일하다.++arr; //컴파일 오류, 상수포인터로 취급한다.int *p = arr;++p; //가능배열의 이름이 포인터이긴 하지만 배열의 이름은 포인터 상수이기 때문에 다른 변수의 주소를 대입할 수는 없다.하지만 포인터 변수에 배열을 대입하게 되면 값을 변경할..
포인터란 메모리의 주소값을 저장하는 변수를 말하며, 포인터 변수라고도 한다.주소의 최소 단위는 바이트로, 각 바이트 마다 고유한 주소가 있다. 포인터의 크기는 주소값을 저장하는 변수이기 때문에 같은 플랫폼에서는 자료형에 상관없이 크기가 전부 같다.32비트 플랫폼에서는 4바이트, 64비트 플랫폼에서는 8바이트 크기를 가진다. 포인터의 자료형에는 전달된 주소에 접근하고 해석하는 방식이 포함되어 있기 때문에 알맞은 포인터 자료형을 사용해야 한다.만약 int형 포인터를 선언하면 해당 포인터는 4바이트 크기의 접근을 하며, 주소에 저장되어 있는 값의 비트를 int 방식으로 읽는다. 강제 캐스팅을 해서 다른 자료형 변수의 값을 읽어드리게 되면 값이 엄청 커지거나 작아지는 식의 다른 값이 들어 올 수 있다.int ..