본문 바로가기

awesome-c Beginner 번역/A tutorial on pointers

<비공식 번역>awesome-c Beginner 번역 : CHAPTER 4 : More on Strings

현재위치


<주의!!>

'A TUTORIAL ON POINTERS AND ARRAYS IN C'의 공식적인 번역이 아니며 수를 받은 것 역시 아닙니다!!




CHAPTER 4 : More on Strings(챕터 4: 문자열에 대해 더)


자 이제, 우리는 매우 단시간에 진행해왔습니다! Chapter 3에서 했던 string의 복사를 약간 상기시켜 봅시다. 그러나 이번에는 다른 관점으로요

아래의 함수를 고려해봅시다:


char *my_strcpy(char dest[], char source[])

{

    int i = 0;

    while (source[i] != '\0')

    {

        dest[i] = source[i];

        i++;

    }

    dest[i] = '\0';

    return dest;

}


string은 문자의 배열이란걸 다시 떠올려봅시다. 여기서 우린 실제적인 복사를 위해서 포인터 방법 대신에 배열 방법을 선택했습니다. 결과는 같습니다. 즉 string은 이전과 같이 정확하게 이 방법을 사용하여 복사됩니다. 이점은 우리가 앞으로 토론해야할 흥미로운 점입니다.


매개 변수(인자)는 값으로 전달되기 때문에 위 코드의 char 포인터의 전달, 배열의 이름에서 실제로는 각 배열의 첫요소의 주소를 전달합니다. 따라서 전달된 인자의 산술적인 값은 우리가 사용한 char 포인터나 배열 이름이나 같다. 어쨋든 source[i]*(p+i)와 동일하다고 생각하는 경향이 있습니다.


사실, 그것이 정답입니다. 즉, a[i]를 쓴다면 *(a + i)를 대체할 수 있고 아무런 문제도 없습니다. 컴파일러는 두가지 케이스를 모두 같은 코드로 생성합니다. 따라서 우리는 포인터 연산을 배열 인덱싱과 동일하 것으로 볼 수 있습니다. 어느 구문이든 같은 결과를 만들어냅니다.


그렇지만 포인터와 배열이 같은 것이다라고 말하는 것이 아닙니다. 둘이 서로 다릅니다. 오직 배열의 요소를 얻어낼 때 배열 인덱싱 사용과 포인터 연산을 사용하는 것 중에 선택해서 쓸 수 있다고 말할 뿐이고, 동일한 결과를 얻을 수 있습니다.


이제, 이 파트의 마지막 표현 (a + i)을 봅시다. + 를 이용한 간단한 덧셈입니다. 그리고 C 상태의 규칙입니다. (a +i)(i + a)는 동일합니다. 따라서 *(i + a)*(a + i)로도 쓸 수 있습니다.


그러나 *(i + a)는 i[a]를 의미하진 않습니다! 진실은 호기심으로부터 옵니다. 다음을 보죠:


char a[20];

int i;


이렇게 써봅시다.


a[3] = 'x';


는 이렇게 쓴것과 동일합니다.


3[a] = 'x';


직접 해보세요! char, integer, long 등의 배열을 설정할 수 있습니다. 그리고 할당합니다. 3번째나 3번째 요소에 지금까지 해오던 방식대로 값을 할당하고 결과를 확인하기 위해서 이 값을 화면에 출력합니다. 제가 위에서 했던 것처럼 배열 표기법을 뒤집어서 쓰면, 좋은 컴파일러는 망설이지 않고 결과는 동일합니다. 호기심은 더 없겠죠!


자 이제, 위에 적힌 함수를 봅시다.:


dest[i] = source[i];


배열 인덱싱과 포인터 연산은 동일한 결과를 산출하기 때문에 우리는 이렇게도 쓸 수 있습니다:


*(dest + i) = *(source + i);


i는 각 항에 더해집니다. 게다가 일반적으로 더 많은 시간이 걸립니다. (i++에 있는 ++ 연산자를 사용해서 수행하는 것보다). 이것은 요즘 최적화된 컴파일러에겐 해당하지 않을 수 있습니다. 그러나 확신할 수는 없는거죠. 따라서 포인터 버젼은 배열 버젼보다는 더 빠를 수 있습니다.


더 빠른 방법은 포인터 버젼을 바꾸는 것 입니다:


while (*source != '\0')


를 간단하게


while (*source)


삽인된 값은 두 경우에서 동일한 시간에 0(FALSE)로 이동할 것이기 때문입니다.


이 점에서 여러분은 포인터를 사용하여 프로그램의 일부를 작성해서 약간의 실험을 할 수도 있을 것입니다. string 조작은 이러한 실험하기에 적합한 대상입니다. 여러분은 이런 표준 함수를 사용할 수도 있을 겁니다.


strlen();

strcat();

strchr();


그리고 여러분의 시스템에 있는 다른 함수들도 쓸 수 있겠죠.


우리는 곧 다른 챕터에서 포인터를 통한 string 조작을 수행할 것입니다. 그러나 지금은, 다음으로 이동하고 structure에 대해 조금 토의해봅시다.

 

출처1 : https://github.com/aleksandar-todorovic/awesome-c

출처2 : http://home.netcom.com/~tjensen/ptr/pointers.htm