프로그래밍

 3198, 1/160 회원가입  로그인  
   SKTCTO
   [C언어]* 포인터연산 잘 아시는분 있으신가요..?

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3374 [복사]


#include <stdio.h>
int main()
{
        char *ptr_ary[5];
        int i;

        ptr_ary[0]="dog";
        printf("%d,%d,%d,%d\n",&ptr_ary[0],*ptr_ary[0],*&ptr_ary[0],ptr_ary[0]);
        
        for(i=0; i<1; i++){
                printf("%s\n", ptr_ary[i]);
        }
        return 0;
}

여기보면 밑에 printf에선 dog라고 나오고,
위에
&ptr_ary[0] = 1245008
*ptr_ary[0] = 100
*&ptr_ary[0] = 4282416
ptr_ary[0] = 4282416
값이 나오는데여;;;;
물론 %d로 해서 그렇겟지만
&ptr_ary[0] = 1245008는 주소값 같은데
*ptr_ary[0] = 100 <<< 이거랑
*&ptr_ary[0] = 4282416 ,ptr_ary[0] = 4282416  << 이거는 무엇인지 아는
천재 프로그래머 계신가요??


  Hit : 3716     Date : 2012/04/02 01:02



    
우느님 ptr_ary[0] = "dog"; 를 수행하고 나면
컴퓨터는 메모리 어딘가에다가 dog 라는 문자열을 저장하고, 그 문자열의 첫번째 문자를 가리키도록 만듭니다. 즉, ptr_ary[0] 은 그 첫번째 문자를 가리키고 있는 것이죠. 또한, 그 첫번째 문자가 있는 곳의 주소가 저장되어 있다고 생각하시면 됩니다.
그래서 *ptr_ary[0] = 100 이 되는 겁니다. 'd'라는 문자는 아스키코드로 100입니다. 그래서 100이 출력된겁니다.
간단히 확인 하실수 있는 방법이 있는데, printf("%c", *ptr_ary[0]); 을 해보시면 문자 'd'가 출력된다는걸 확인할 수 있습니다.

*&ptr_ary[0]은 ptr_ary[0]이 가리키고 있는 곳의 주소라고 해석할 수 있습니다.
SKTCTO님의 컴퓨터에서는 4282416라는 메모리 주소에다가 'd'라는 문자를 저장했네요.
그러면 4282417에 'o'라는 문자가 저장되어있고, 4282418에 'g'라는 문자가 저장되어 있겠네요.
이것은 printf("%c,%c,%c\n",*ptr_ary[0], *(ptr_ary[0]+1),*(ptr_ary[0]+2)); 을 통해서 확인 할 수 있습니다.
이 메모리 주소는 컴퓨터마다 다르고, 같은 컴퓨터로 코딩하더라도 실행할때 마다 달라질 수 있습니다.

ptr_ary[0]은 위에서 말했다 싶이 문자열의 첫번째 문자가 있는 곳의 주소를 나타내고 있습니다.
2012/04/02  
gamja 우느님께서 정확하게 설명해 주셨네요.

1.
*ptr_ary[0] == *(4282416)


2.
--------참조의 모습----------------------------------------------
&ptr_ary[0] -> ptr_ary[0] -> 'd'
(char **) (char *) (char)
--------------------------------------------------------------------
&ptr_ary[0]은 더블 포인터가 됩니다.
*(&ptr_ary[0])은 결국 더블 포인터가 가리키는 값을 참조하는 격이 되므로 ptr_ary[0]이 됩니다.

결국 *&ptr_ary[0] == *(1245008) == ptr_ary[0] 이 됩니다.


2012/06/10