안녕하세요. 이번 시간에는 C언어 에서 포인터, 배열, 그리고 포인터 연산에 대하여 간단하게 정리해 보려고 합니다.부족한 부분이 있다면 알려주시면 감사하겠습니다.
메모리
컴퓨터의 메모리는 데이터를 보관하는 장소
바이트(8 bits)단위로 주소가 지정됨
모든 변수는 주소를 가짐
포인터
메모리 주소를 값으로 가지는 변수이다. 포인터 변수는
다음과 같이 선언된다.
type-name * variable-name;
variable-name은 선언됨 포인터 변수의 이름이며, * 는 variable-name
이 포인터 변수임을 표시하고, type-name은 포인터 변수 variable-name
에 저장될 주소에 저장될 데이터의 유형을 지정
int * ptr;
연산자 &는 변수로부터 그 변수의 주소를 추출하는 연산자이다.
int c = 12;
int *p;
p = &c; //포인터 변수 p에 변수 C의 주소를 저장한다.
int x = 1, y = 2;
int * ip;
ip = &x;
// x = 1, y = 2, ip = 1028
y = *ip;
// x = 1, y = 1, ip = 1028
*ip = 0;
// x = 0, y = 2, ip = 1028
포인터와 배열은 매우 긴밀히 연관되어 있다.
예를 들어 다음과 같이 선언된 배열 a가 있다고 하자.
int a[10]; // 10개의 정수를 수용할 수 있는
// 메모리 (40바이트)가 할당됨
//배열의 이름은 배열의 시작 주소를 저장하는 포인터 변수임
//(단 그 값을 변경할 수 없음)
포인터 arithmetic
*a와 a[0]은 동일한 의미이다.
또한 a[1]은 *(a+1)과 동일하고, a[i]는 *(a+i)와 동일하다.
int a[10];
*(a+i) // 이러한 연산을 포인터 arithmetic이라고 부른다.
동적 메모리 할당
변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당할 수 있다. 이것을
동적 메모리 할당(dynamic memory allocation)이라고 부른다.
malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를
할당하고 그 시작 주소를 반환한다.
malloc 함수
int * p;
p = (int * )malloc(40); //malloc이 반환하는 주소는 타입이 없는 주소(void *)이다. 정수들을 저장하기 위해서 이것을 int *로 변환한다.
//반드시 필요한 건 아니다.
// 할당받을 메모리의 크기를 byte단위로 지정한다. 여기서는 10개의 정수를 저장하기
//위해서 40바이트를 요청하였다.
if (p == NULL){
/* 동적 메모리 할당이 실패 */
/* 적절한 조치를 취한다. */
}
p[0] = 12; //malloc으로 할당받은 메모리는 이렇게 보통의 배열처럼 사용한다.
p[1] = 24;
*(p+2) = 36;
...
배열 키우기
동적으로 할당된 배열은 공간이 부족할 경우 더 큰 배열을 할당하여 사용할 수 있다.
int * array = (int *)malloc(4*sizeof(int));
/* 배열 array의 크기가 부족한 상황이 발생한다. */
int * temp = (int *)malloc(8*sizeof(int));
int i;
for (i = 0; i < 4; i++)
tmp[i] = array[i];
array = tmp;