C & C++

[C] 포인터, strcpy, strncpy

  • -
728x90

포인터(pointer)

해석해보면 '무언가를 가리키는 것' 이라고 할 수 있다. 

(출처 :  http://tcpschool.com/c/c_datatype_variable )

 

 

변수가 컴퓨터에 저장될 때를 그림으로 나타내면 왼쪽과 같다.

특정 주소를 갖는 메모리에 변수의 크기 만큼 할당된다. 크기가 커져 메모리를 더 사용할 때에는 변수의 시작위치의 주소가 해당 변수의 주소가 된다.

(출처 :  http://tcpschool.com/c/c_datatype_variable )

포인터 변수는 메모리에 가리키고 싶은 주소를 담게하는 변수다.

 

포인터는 함수를 이용할 때 진가를 발휘한다. 함수에서 매개변수는 인자를 전달할 때 복사해서 사용한다. 즉, 원래 변수는 다른 함수에 매개변수로 주어져도 수정할 수 없다. 따라서 포인터로 메모리의 주소를 넘겨주면 다른 함수에서도 메모리에 직접적으로 참조할 수 있게된다.

 

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와 방식은 거의 비슷하다. 

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.