본문 바로가기

c++17

[C/C++] 이중포인터와 void 포인터 이중포인터와 void 포인터 문자열배열은 이중포인터이다 아래와 같이 문자열 배열이 있고, 해당 문자열배열의 주소를 void 포인터에 초기화시켰다고 가정해보자. char* arr[] = {"banana", "apple"}; void* vrr = arr; 여기서 다들 아는 내용을 정리해보자. 배열의 이름은 해당 배열의 첫 번째 요소의 주소를 나타내므로, arr는 &(arr[0])와 동일하다. arr는 char* 타입의 요소를 저장하는 배열이기 때문에, 이를 char** 타입으로 볼 수 있다. 즉, arr는 char* 타입의 배열의 첫 번째 요소의 주소를 가리키는 포인터이다. 포인터 변수의 크기는 64비트 시스템 기준 8바이트이다. 메모리 주소를 모두 표현해야 하기 때문이다. arr 는 문자열포인터의 배열로,.. 2024. 4. 20.
[C/C++] 정올 - 달팽이 트리 #5398 문제 달팽이의 나라 달팽국에서는 크리스마스 때 특별한 트리를 세워 장식한다. 이 트리를 달팽국 사람들은 달팽이 트리라고 부르는데, 달팽이 트리는 꼭대기부터 0~9까지의 정수가 반시계 방향으로 밖에서 안으로 채워진 형태를 띄고 있다. 달팽이 트리의 크기는 매 해 달팽국의 행복도에 비례하여 다르게 정해진다. 예를 들어 아래와 같이 행복도가 6이면 크기 6짜리 달팽이 트리가 만들어진다. 달팽이 삼각형 문제와 똑같이 풀면 된다. https://microelectronics.tistory.com/52 int m = n; int x = -1; int y = 0; int num = 0; while ( m > 0 ){ for ( int i = 1; i 2024. 4. 17.
[C/C++] 정올 - 달팽이 삼각형 #1337 문제 삼각형의 높이 N을 입력받아서 아래와 같이 숫자 0부터 달팽이 모양으로 차례대로 채워진 삼각형을 출력하는 프로그램을 작성하시오. 왼쪽 위부터 시계방향으로 오른쪽 아래로 이동하면서 숫자 0부터 N개를 채우고 다시 왼쪽으로, 다음은 위쪽으로 반복하면서 채워 나간다. (숫자 9 다음에는 0부터 다시 시작한다.) 2차원 배열에서, 삼각형 모양으로 출력되야 하므로 배열 전체를 사용하지 않는 값(예를들어 -1) 로 채운다. 이때 가변길이배열은 런타임 초기화가 불가능하므로, cstring 헤더의 memset 함수를 활용한다. int arr[n][n]; memset(arr,-1,sizeof(int)*n*n); int m = n; int x = -1; int y = -1; int num.. 2024. 4. 17.
[C/C++] 정올 - 달팽이 사각형 #1707 문제 정사각형의 크기를 입력 받은 후 시계 방향으로 돌면서 다음과 같은 형태로 출력하는 프로그램을 작성하시오. (1) 가장 왼쪽 위의 좌표부터 차례로 숫자를 대입 시킨다. (2) 오른쪽으로 채워 나가다가 끝이면 다시 아래 → 왼쪽 → 위 →오른쪽의 순으로 모두 채워질 때까지 반복한다. 배열에 원소를 넣을때 마다, cnt 값을 올린다. cnt 값이 n*n 이하일때까지 while 문을 돌린다. while 문 내에 for 문이 4 개 포함되어있지만, 루프에 문제가 생기지는 않는다. for 문이 반복되는 조건은 m 이 1이상일 때이기 때문이다. n*n 값이 채워지는 경우 m은 0이 되므로 for문은 돌지 않고 정상적으로 의도한 만큼 while 문은 돌고 종료된다. int arr[n].. 2024. 4. 17.
[C/C++] 동적 2차원 배열과 가변길이배열(VLA) C언어의 표준에서는 고정된 크기의 배열을 선언할 때 배열의 크기를 컴파일 시간에 알 수 있어야 했다. 그렇기 때문에 C99 표준 이전에는 배열의 크기로 변수를 사용하는 것이 허용되지 않았다. 하지만 C99부터는 '가변 길이 배열'(Variable Length Arrays, VLAs)의 개념이 도입되어 실행 시간에 배열의 크기를 결정할 수 있게 되었습니다. 즉, 배열의 사이즈에 변수가 들어가도 됐다. 그 이전에는 동적할당을 이용하여, 이 문제를 해결했다. 아래는 VLA 를 사용하여 입력받은 높이와 너비에 해당하는 사각형을 숫자로 채우는 코드이다. #include int main(){ int n; int m; while (1){ scanf("%d",&n); scanf("%d",&m); if ( n > 0 &.. 2024. 4. 11.
[C/C++] C++ 에서의 콜백함수 C++에서 콜백 함수의 사용 C++에서 콜백 함수는 여전히 중요하며, C언어에서의 사용법을 기반으로 더 다양하고 강력한 방법으로 발전하였다. 기본적으로, C++에서는 함수 포인터, 함수 객체, 람다 표현식 등을 통해 콜백 함수를 구현할 수 있다. 함수 포인터: C언어의 콜백 함수 구현 방식과 유사하게, C++에서도 함수 포인터를 사용해 콜백을 구현할 수 있다. 하지만, 이 방법은 객체 지향적 특성을 충분히 활용하지 못하는 단점이 있다. 함수 객체 (Function Objects 또는 Functors): C++에서는 객체를 함수처럼 호출할 수 있는 함수 객체를 사용하여 콜백을 구현할 수 있다. 이는 클래스 내에 operator()를 오버로딩함으로써 가능하다. 이 방법은 상태를 유지할 수 있는 장점이 있으며.. 2024. 4. 7.
[C/C++] 콜백함수 (Callback Function) 콜백 함수란?콜백 함수는 다른 코드의 인자로 전달되어, 그 코드에 의해 어느 시점에 호출되는 함수인데특히 비동기적 작업, 이벤트 리스닝, 또는 특정 조건 하에서 실행되어야 할 코드를 처리할 때 유용하다.C언어에서 콜백 함수는 함수 포인터를 통해 구현되는데, 함수 포인터는 함수의 주소를 저장하는 변수로, 이를 통해 함수를 다른 함수의 매개변수로 전달하거나 변수에 저장한 함수를 호출할 수 있다.콜백 함수의 구현콜백 함수를 사용하는 기본적인 방법은 다음과 같다함수 포인터 선언: 콜백으로 사용될 함수의 타입에 맞는 함수 포인터를 먼저 선언한다. 이는 콜백 함수의 인터페이스(시그니처)를 정의한다.콜백 함수 정의: 이후에 해당 함수 포인터 타입에 맞게 콜백 함수를 정의한다. 콜백 함수는 선언된 함수 포인터 타입의 .. 2024. 4. 1.
[C/C++] C언어에서의 객체지향 아래 코드는 구조체를 이용해 Stack 자료구조를 작성한 예시이다. typedef struct Stack { int top; // Index of the top element in the stack. Initially -1 because the stack is empty. unsigned capacity; // Maximum number of items that can be stored in the stack. int* array; // Pointer to the array that will store the stack's elements. } Stack; Stack* createStack(unsigned capacity) { Stack* stack = (Stack*) malloc(sizeof(Stack.. 2024. 3. 31.