포인터(pointer)
해석해보면 '무언가를 가리키는 것' 이라고 할 수 있다.
변수가 컴퓨터에 저장될 때를 그림으로 나타내면 왼쪽과 같다.
특정 주소를 갖는 메모리에 변수의 크기 만큼 할당된다. 크기가 커져 메모리를 더 사용할 때에는 변수의 시작위치의 주소가 해당 변수의 주소가 된다.
포인터 변수는 메모리에 가리키고 싶은 주소를 담게하는 변수다.
포인터는 함수를 이용할 때 진가를 발휘한다. 함수에서 매개변수는 인자를 전달할 때 복사해서 사용한다. 즉, 원래 변수는 다른 함수에 매개변수로 주어져도 수정할 수 없다. 따라서 포인터로 메모리의 주소를 넘겨주면 다른 함수에서도 메모리에 직접적으로 참조할 수 있게된다.
strcpy과 strncpy로 예를 들어보자.
strcpy
<string.h>헤더파일의 함수로, string copy의 약어, 문자열을 복사하는 함수이다.
char *strcpy(char *dest, const char *origin);
origin -> dest(destination) 복사
구현
char *ft_strcpy(char *dest, char *src)
{
int i;
i = 0;
while (src[i])
{
dest[i] = src[i];
i++;
}
return (dest);
}
int main(void)
{
char *src;
char dest[20];
src = "Hello World!";
ft_strcpy(dest, src);
return 0;
}
char형 변수를 포인터 변수로 사용하면 문자열을 '선언' 할 수 있다. C언어에서 동적할당을 이용하지 않는 이상 크기가 변할 수 있는 변수는 사용할 수 없다. 따라서 src는 "Hello World!"를 선언했기 때문에 문제되지 않지만, dest를 포인터변수로 사용하여 ft_strcpy의 결과값을 얻는다면 컴파일 에러가 날 것이다.
위와 같은 구조로 저장되어있다고 생각하면 편하다. 포인터 변수 *str과 dest의 첫 번째 주소를 넘겨주어 인덱스 값을 넘기며 dest[i]에 str[i]를 복사해주고 dest[i]의 마지막에 '\0' NULL값을 넣고 dest의 첫 번째 주소를 반환한다.
C언어에서 배열의 이름은 해당 배열의 첫 번째 주소를 의미하기도 한다.
strncpy
<string.h> 헤더파일의 함수로, string n copy, 원본의 문자열에서 n개만 뽑아서 사용한다는 의미이다.
char *strncpy(char *dest, const char *origin, size_t n);
구현
char *ft_strncpy(char *dest, char *src, unsigned int n)
{
int i;
i = 0;
while (src[i])
{
dest[i] = src[i];
i++;
if (i >= n)
break ;
}
while (i < n)
{
dest[i] = '\0';
i++;
}
return (dest);
}
srtcpy와 방식은 거의 비슷하다.