권오흠 교수 유튜브 강의: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의 값을 바꿀 수 없다. 그렇기 때문에 동적할당을 쓴다.
이 부분은 볼때마다 새롭고 부끄럽지만 둘 다 제대로 써 본적이 없다. 문제를 풀어서 완전히 이해하도록 노력해야지.
댓글