목록C언어/C언어 코딩 도장 (103)
문타쿠, 공부하다.

38.6 연습문제: 포인터에 할당된 메모리를 3차원 배열처럼 사용하기 #include #include int main(void) { /* depth = 2, row = 3, col = 5 */ long long*** m = malloc(sizeof(long long**) * 2); for (int depth = 0; depth < 2; depth++) { m[depth] = malloc(sizeof(long long*) * 3); for (int row = 0 ;row < 3; row++) { m[depth][row] = malloc(sizeof(long long) * 5); } } m[1][2][4] = 100; printf("%lld\n", m[1][2][4]); for (int depth = 0; ..

INTRO 지금까지 크기가 고정된 배열을 사용했다. int numArr[10]; 이번에는 포인터에 메모리를 할당하여 배열처럼 사용해보자. #include int main(void) { int size; scanf_s("%d", &size); int numArr[size]; return 0; } 하지만 위와 같이 프로그램 실행 중에 원하는 크기만큼 배열을 생성하는 기능(가변 길이 배열)은 GCC에서는 지원하지만, 내가 사용 중인 Visual Studio 2022에서는 지원하지 않아 컴파일 에러가 발생한다. 그럼 배열의 크기를 동적으로 할당하려면 어떻게 해야할까? -> 크기를 동적으로 지정하려면 포인터를 선언하고 메모리를 할당한 뒤 메모리를 배열처럼 사용해야한다. 38.1 포인터에 할당된 메모리를 배열처럼 ..

37.8 연습문제: 행렬의 주대각선 성분 구하기 #include int main(void) { int matrix[8][8] = { { 1, 2, 3, 4, 5, 6, 7, 8}, { 9, 10, 11, 12, 13, 14, 15, 16}, {17, 18, 19, 20, 21, 22, 23, 24}, {25, 26, 27, 28, 29, 30, 31, 32}, {33, 34, 35, 36, 37, 38, 39, 40}, {41, 42, 43, 44, 45, 46, 47, 48}, {49, 50, 51, 52, 53, 54, 55, 56}, {57, 58, 59, 60, 61, 62, 63, 64} }; for (int m = 0; m < 8; m++) { printf("%d ", matrix[m][m])..

37.1 2차원 배열을 선언하고 요소에 접근하기 #include int main(void) { int numArr[3][4] = { { 0, 1, 2, 3}, {10, 11, 12, 13}, {20, 21, 22, 23} }; printf("%d\n", numArr[0][1]); printf("%d\n", numArr[1][2]); printf("%d\n", numArr[2][3]); return 0; } 37.2 2차원 배열을 초기화하기 #include int main(void) { int numArr[3][4] = { 0, }; printf("%d\n", numArr[0][1]); printf("%d\n", numArr[1][2]); printf("%d\n", numArr[2][3]); return ..

36.11 연습문제: 점수 평균 구하기 #include int main(void) { float scores[10] = { 67.2f, 84.3f, 97.0f, 87.1f, 71.9f, \ 63.0f, 90.1f, 88.0f, 79.7f, 95.3f }; float sum = 0.0f; float avg; for (int i = 0; i < 10; i++) { sum += scores[i]; } avg = sum / (sizeof(scores) / sizeof(float)); printf("%f\n", avg); return 0; } 36.12 연습문제: 2진수를 10진수로 변환하기 #include int main(void) { int decimal = 0; int binary[4] = { 1, 1, 0..

36.1 배열을 선언하고 요소에 접근하기 #include int main(void) { int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 }; printf("%d\n", numArr[0]); printf("%d\n", numArr[5]); printf("%d\n", numArr[9]); return 0; } // 배열 선언 시 값을 초기화한다면 배역의 크기 생략 가능 int numArr1[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 }; // 컴파일 에러 int numArr2[]; 36.2 배열을 0으로 초기화하기 "배열의 모든 요소를 간단하게 0으로 초기화하기" #include int main(void) { i..

35.6 연습문제: 메모리 할당하기 #include #include #include int main(void) { int* numPtr1 = malloc(sizeof(int)); long long* numPtr2 = malloc(sizeof(long long)); *numPtr1 = INT_MAX; *numPtr2 = LLONG_MAX; printf("%d %lld\n", *numPtr1, *numPtr2); free(numPtr1); free(numPtr2); return 0; } 35.7 심사문제: 두 정수의 합 구하기 #include #include int main(void) { int num1; int num2; int* numPtr1 = malloc(sizeof(int)); int* numPtr..

INTRO 포인터에 원하는 만큼 메모리 공간을 할당받아 사용하는 방법을 알아보자. 메모리는 malloc -> 사용 -> free 패턴으로 사용한다. 35.1 메모리 할당하기 메모리를 사용하려면 malloc(memory allocation) 함수로 사용할 메모리 공간을 확보해야 한다. -> 필요한 메모리 크기는 바이트 단위로 지정 -> stdlib.h 헤더 파일 선언 -> 원하는 시점에 원하는 만큼 메모리를 할당할 수 있다고 하여 동적 메모리 할당이라 부른다. #include #include int main(void) { int num1 = 20; int* numPtr1; int* numPtr2; numPtr1 = &num1; // int의 크기 4바이트만큼 동적 메모리 할당 numPtr2 = malloc..

34.9 연습문제: 포인터와 주소 연산자 사용하기 #include int main(void) { int* numPtr; int num1 = 10; int num2 = 20; numPtr = &num1; printf("%d\n", *numPtr); numPtr = &num2; printf("%d\n", *numPtr); return 0; } 34.10 심사문제: 포인터와 주소 연산자 사용하기 #include int main(void) { int* numPtr1; int** numPtr2; int num1; scanf_s("%d", &num1); numPtr1 = &num1; numPtr2 = &numPtr1; printf("%d\n", **numPtr2); return 0; }

INTRO "우리가 변수를 사용할 때, 변수는 어디에 생기는 것일까?" 변수는 컴퓨터의 메모리에 생성된다. 즉, 메모리에 일정한 공간을 확보해두고 원하는 값을 저장하거나 가져오는 방식 #include int main(void) { int num1 = 10; printf("%p\n", &num1); return 0; } 변수는 num1과 같이 이름으로 사용하지만, 메모리의 특정 장소에 있으므로 메모리 주소로도 표현할 수 있다. 메모리 주소는 고정된 것이 아니라 컴퓨터마다, 실행할 때마다 달라짐 변수의 메모리 주소를 구할 때는 변수 앞에 &(주소 연산자)를 붙이면 된다. 서식 지정자로 %p(포인터) 사용 메모리 주소는 16진수 형태이므로 %x, %X를 사용해도 된다. 시스템이 32비트인지 64비트인지에 따라..