포인터와 배열
알아두어야 할 점
char *pszData = "Hello"; 라는 식에서 pszData에는 무엇이 저장이 될까? 나는 그래도 변수니까 hello가 저장될 줄 알았는데, 사실은 hello가 저장되어있는 주소가 저장되는 것이다. hello는 배열로 배열의 기준인 h의 주소가 저장이 되는 것이다. (사실 []는 *와 똑같다. 다차원 배열은 예외) 그래서 char *pszData = "Hello"; 는 char *pszData = (H의 주소)[0]; 과 같다. 이 점 알아두고 예제를 들어가자.
예시
char szName[16] = {"Hong gildong"}; char *pszName = szName ; printf ("%c\n", szName[3]); 라는 식이 있다고 하자. 여기서 배열의 이름은 그냥 주소기에 이때 포인터 변수는 이제 변수의 다른 경로로 쓰이게 된다. 그래서 printf ("%s\n", szName[3]); 라는 식도 printf ("%s\n", pszName[3]); 으로 똑같이 쓸 수 있고, 이때의 출력은 hong이 0이 기준으로 h에서 시작해서 오른쪽으로 3칸 가면 g가 있으므로, 이 g가 출력된다.
여기서 예제에서는 sprintf라는 함수가 나오는데, 이 형식은 sprintf( (주소), %s, "(문자)“); 다. 하는 일은 ” “안의 문자를 출력하는데 %s, 즉 문자열로 출력한다. 이때 그 값을 주소에 저장하는 것이다. (sprintf함수는 보안상의 문제가 있으니 참고하자)
그래서 char szName[16] = { }; 에서 sprintf함수로 문자열을 입력해줄 수 있는 것이다. 이때 중요한 점은 포인터로도 위의 sprintf형식의 주소를 대체할 수 있으며, 문자열을 sprintf함수로 입력받았을 때, 이것을 포인터 변수로 그 대상인 변수처럼 자유롭게 대체로 쓸수 있는 것이다.
malloc함수와 free함수
교재에서 등장하는 둘은 동적할당이라는 개념을 알고 있어야 이해하는 문제다. 사실 나는 교재가 없기에 구글링으로 내용을 정리했다. 우선 malloc함수는 동적할당을 하는 방법이고, free함수는 그 동적할당으로 확보한 메모리가 계속 실행되므로 수동으로 해제해주는 함수이다. 우선 이 이해만 하고 영상으로 넘어가자.
영상에서 강조하는 점은, 이 malloc[16]를(char[16]) int[4]로 볼 수 없나 라는 의문이다. 당연히 가능하다. 그래서 int *일 경우에는 1 int에는 4byte로 4칸을 묶어서 (포인터) + 1이라면 int형으로 5칸 ~ 8칸까지의 메모리가 되고 (포인터) + 2라면 9칸 ~ 12칸까지의 메모리가 되겠다. 근데 포인터는 주소(위치정보)를 담고 있으므로 다시 가리키는 변수로 해주고 싶으면 *(간접지정연산자)를 붙여주는 것 잊지 말자.(‘변수‘ -> & -> ‘주소(위치정보)‘ -> * -> ‘변수’) 사실 다중포인터는 잘 안 쓰고 지금 배운 내용이 포인터의 끝이라고 볼 수 있다. 다중포인터는 그런가보다 해도, 이 내용은 확실히 이해하자.