-
배열, 포인터, 문자열, 동적메모리할당
포인터: 메모리 주소를 값으로 가지는 변수
선언 방법 -> type-name * variable-name;
ex) int * ptr;
연산자 &: 변수로부터 그 변수의 주소를 추출하는 연산자
포인터와 배열
int a[10]; // 10개의 정수를 수용할 수 있는 메모리 (40바이트)가 할당됨
* 배열의 이름은 배열의 시작 주소를 저장하는 포인터 변수임
#include <stdio.h> int main() { int sum, i, average; int num[10]; for (i = 0; i < 10; i++) scanf("%d", &num[i]); sum = calculate_sum(num); average = sum / 10; printf("%d\n", average); return 0; } int calculate_sum(int* array) // 배열을 매개변수로 받을 때, int array[] 대신 이렇게 포인터로 받을 수도 있음 { int sum, i; sum = 0; for (i = 0; i < 10; i++) sum = sum + array[i]; return sum; }
- *a와 a[0]은 동일한 의미이다.
- 또한 a[1]은 *(a+1)과 동일하고, a[i]는 *(a+i)와 동일하다.
동적메모리 할당
- 변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 이것을 동적 메모리 할당이라고 부른다.
- malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 변환한다.
#include <stdio.h> #include <stdlib.h> int main() { int* p; // malloc이 반환하는 주소는 타입이 없는 주소(void*)이다. 정수들을 저장하기 위해서 // 이것을 int* 로 변환한다. (반드시 필요한 것은 아님) p = (int*)malloc(4*sizeof(int)); if (p == NULL) { //동적 메모리 할당 실패 //적절한 조치를 취한다. } // malloc으로 할당받은 메모리는 이렇게 보통의 배열처럼 사용한다. p[0] = 12; p[1] = 24; *(p + 2) = 36; }
배열 키우기
#include <stdio.h> #include <stdlib.h> int main() { int* array = (int*)malloc(4 * sizeof(int)); //16byte array[0] = 1; array[1] = 2; *(array + 2) = 3; /* 배열 array의 크기가 부족한 상황이 발생한다. */ int* tmp = (int*)malloc(8 * sizeof(int)); int i; for (i = 0; i < 4; i++) tmp[i] = array[i]; array = tmp; //동적할당을 했을 때만 array값 수정 가능함 array[4] = 4; array[5] = 5; printf("%d", array[5]); return 0; }
* 위의 코드가 좋은 코드는 아님 (처음 할당한 16byte 크기의 공간은 쓰지 않는 공간으로 계속 가지고 있기 때문)