본문 바로가기
자료구조 data structure

자료구조 제1강: C언어에서 포인터, 배열, 포인터 연산, 동적메모리 할당

by 질서정연_ 2020. 5. 15.

권오흠 교수 유튜브 강의:https://www.youtube.com/watch?v=-XbHQQ8pUQY&list=PL52K_8WQO5oXIATx2vcTvqwxXxoGxxsIz&index=1

 

-포인터 

포인터는 메모리 주소를 값으로 가진다. 

int*ptr; // int 형 포인터 변수 ptr이 있다는 뜻이다. int 형 포인터 변수라는 말은 p에 저장되는 타입이 정수라는 뜻이다.

 

-&연산자

&는 변수의 주소를 추출한다.

int c = 12;  //메모리에 c라는 이름을 주고 거기에 12를 넣는다.

int *p; //int형 포인터 변수 p가 만들어졌다.

p = &c; //p에 c의 주소값을 넣는다. p가 c를 가리킨다.

 

int x=1, y=2; 

int *ip; //int형 ip 포인터

ip = &x;  //ip에 x의 주소를 넣는다. ip가 x를 가리킨다.
y = *ip;  //치환문에서 오른쪽은 포인터 변수 안의 값이나 그 변수가 가진 값을 사용하겠다는 의미이다. 그러므로 y에 ip가 가리키는 변수의 값.그러니까 x의 값 1을 y에 넣겠다는 말이다. 그러므로 y=1이 된다.

*ip = 0; //치환문에서 왼쪽은 변수가 지정하는 자리를 말한다. 그러므로 ip가 가리키는 x에 0을 넣겠다는 의미이다. 그러므로 x는 0이 된다. 

 

-포인터와 배열

배열의 이름은  배열의 시작 주소를 저장하는 포인터 변수다. (단 그 값을 변경할 수 없음)

int arr[10]; 을 만들면 arr[10]이 만들어 짐과 동시에 arr의 첫번째 칸을 가리키는 포인터 변수 *arr이 생긴다. 

그러므로 void get_sum (int arr[]) 와 void get_sum (int *arr)는 같다. 

*a와 a[0]은 동일한 의미이다. 또한 a[1]은 *(a+1)과 동일하고, a[i]는 *(a+i)와 동일하다. 

 

-동적메모리 할당.

malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환한다.

malloc을 하면 메모리 공간을 확보하고 시작주소를 리턴한다. 이 시작주소를 잃어버리면 안되기때문에 반드시 보관해야한다. 그래서 p=(int *)malloc(40); 이렇게 malloc의 리턴값을 포인터변수에 저장한다. 

(int *)은 정수를 저장한다는 의도이기 때문에 (void *)로 써도 되고 (char *)로 써도 됨. 

메모리를 필요한 만큼 다시 할당하게 해 준다. 

p=(int *)malloc(4*sizeof(int)) //4*sizeof(int). 즉 16byte크기를 만들고 그걸 가르키는 p를 만든다.

동적으로 할당된 배열은 공간이 부족할 경우 더 큰 배열을 할당하여 사용할 수 있다.

arr=(int *)malloc(4*sizeof(int)) //int 4개가 들어갈 수 있는 배열 네칸을 arr가 가르킨다. 여기서 칸이 모자라다면,

tmp=(int *)malloc(8*sizeof(int)) //int 8개가 들어갈 수 있는 배열 8칸을 tmp가 가르킨다. arr보다 칸이 많아졌다.

arr=tmp //둘 다 포인터이기 때문에 arr이 가르키는 곳이 배열 네칸이 아닌 배열 8칸을 가르키게된다. 기존에 가르키던 arr은 더 이상 가르키지 않고 사라진다. arr가 차지하는 메모리는 쓰지않는데 계속 자리를 차지하기 때문에 free(arr)을 해줘서 풀어줘야한다. 

 

-배열과 동적 할당이 똑같은 것 같은데 배열말고 동적할당을 쓰는 이유는?

int arr[10]과 arr=(int *)malloc(10*sizeof(int))는 같다. 그런데 동적 할당을 쓰는 이유는 arr[10]이 처음에 만들어 졌을 때 arr의 시작주소를 가르키는 *arr도 생긴다고 했었다. 여기서 *arr의 값을 바꿀 수 없다. 그렇기 때문에 동적할당을 쓴다. 

 

 

이 부분은 볼때마다 새롭고 부끄럽지만 둘 다 제대로 써 본적이 없다. 문제를 풀어서 완전히 이해하도록 노력해야지.

 

 

댓글