회원가입 ID/PW 찾기

펌웨어 & 코딩언어 HOT아~~

あさひ2008.01.15 22:2101.15조회 수 916댓글 20이 게시물을

AA
1빠네 ㅋㅋㅋㅋ
c언어을 널널하게 공부해서 다시 공부합니다 ㅋ 
포인터는 1학년떄 배우질 않아서 하나도 모릅니다
강의도 듣고 했는데

도대체 이놈이 어디다가 써먹습ㄴㅣ까?
아무리 누씻고 찾아봐도 쓰이는 곳이 없네여~
궁금합니다 ㅋ
댓글 20
  • 초보자의 입장에서 한 말씀 드리겠습니다.

    씨언어 입문할때 저도 "포인터를 왜쓸까???" 생각을 많이 했습니다.
    포인터를 안써도 충분한 프로그램을 짤수 있는데 말입니다.
    하지만 이 생각은 잘못된 생각입니다.
    초보자들이 씨언어로 프로그램을 짠다면 과연 어느 정도의 분량이 나올까요???
    아마 100~1000줄정도 될 것입니다.
    이렇게 프로그램을 짜다보면 포인터의 사용이 무의미 함을 느낄 것입니다.
    하지만 프로그램의 소스가 엄청난 분량을 가지면 어떻게 할까요...
    일일이 변수타입을 설정해서 그 값을 일일 지정해주는 것이 좋을까요?
    아니면 변수가 저장되어 있는 값의 메모리상의 주소를 가져다 쓰는게 좋을까요? <-- 포인터
    아마 프로그램을 잘 짠 사람이라면 아마도 포인터를 쓰겠지요..
    가장 큰 이유는 프로그램 루틴들의 효율성을 증가시킬 수 있다는 장점때문에도 아마 그럴 것입니다.

    MCU에서는 C언어로 프로그램을 짤때 포인터를 거의 볼수가 없을 것입니다.
    저의 생각으로는 위에서와 같이 프로그램소스가 짧기 때문에 포인터의 사용이 별로 없는 것 같습니다.
    하지만  MCU에서도 프로그램을 코딩하다가 소스분량이 많아 지면 포인터를 사용하는게 좋겠지요.. 

    아참 그리고 LCD소스 보시면 포인터를 사용하신 걸 본적이 있으실 겁니다.
    바로 문자열배열과 포인터입니다.
    배열과 포인터를 사용하시면 아주 편리합니다 .

    결국은 포인터를 어느 정도 알고 있어야 한다는 결론이 나오내용 ^^;


  • 아참 c언어에서 배열과 포인터의 조합은 삼합이라고 할까요 ㅎㅎㅎ
    삼합보다는 흔희 꽃이라고 하니 꽃도 좋구요 ㅎㅎ

  • No Profile
    프로그램 언어마다 포인터의 유무가 다른데요.. 머리가 복잡해지는 반면에 프로그램이 간결하고 쉬워질수도 있습니다.

    가장 핵심적인것은 매우 큰 크기의 변수를 전달할때 포인터를 사용하면 고작 4바이트면 데이터에 액세스할 수 있다는 것이겠지요^^;;

    전 포인터를 좋아하는 타입인지라..ㅅㅅ
  • No Profile
    ㅋㅋ 위에서 다 좋은 말씀 하신거 같은데..^^

    포인터는 꼭 필요하지는 않습니다.

    포인터를 사용을 안하더라도 코드는 구현을 할 수 있습니다.

    하지만 소스의 길이는 길어지겠죠!?

    그리고 아직 제가 하드웨어 쪽으로 거의 공부를 안해서

    모르겠는데..;; 위에 빠숑님 말 처럼 mcu에서는 거의 포인터를 사용을 할 일이 없습니다.

    mcu에서는 거의 바로 주소로 접근을 해서 그런거 같기도 같고, 메모리 용량이 크지도 않기 때문에..

    그런거 같기도 같고.. ㅋㅋ 그냥 이건 제생각..ㅋㅋ

    하지만.. 하드웨어에서 c언어를 사용하는 것이 아니라.. 일반 소프트웨어 적으로 코딩을 할때는

    c언어에서 포인터를 사용하는 이유는 아크마님 말처럼.. 프로그램이 간결해 지기 때문에 사용을 많이 한답니다.

    그래서 조금 긴 프로그램 주소록 프로그램정도만 짜도 포인터가 많이 쓰이는 것을 보게 될껍니다.

    그래서 c언어 조금만.. 공부 하시다가 보면.. 포인터의 쓰임새에서는 하두 많이 써서 자연스럽게

    익힐 수 있을꺼 같네요;;

    하지만 포인터를 사용하기 위해서는 확실히 이해를 하고 사용을 하셔야 됩니다.

    포인터에 대한 에러는 정말 잡기가 힘듭니다..ㅋㅋㅋ;;


    그러므로 포인터는 !! 꼭 필요한 것은 아니지만.. 안쓰면 안되는 것이기에.. 필요하다는 말;; ㅋㅋ

    이상.. 잠이 덜 깬상태에서 주절주절 이였습니다..;;

    이거 잠깨고 보면.. 이상할꺼 같앵..ㅠㅠ;;

  • No Profile
    글쓴이 あさひ 08.01.16 14:33 댓글 좋아요 0 싫어요 0

    혹시 포인터로 만드신 간단한 프로그램 있음 보여 주세요 .
    궁금합니다 어떻게 쓰여지는질..

  • No Profile

    모든 비밀은 정모에서...ㅋㅋㅋ to be continued

  • No Profile
    글쓴이 あさひ 08.01.16 19:58 댓글 좋아요 0 싫어요 0

    아니 아크마님 ㅋㅋㅋ
    저 알잔습니까 ...
    영어 땜에 고향에도 못내려가는 처지인데 ㅜㅜ
    게다가 학생에다가 ㅜㅜ
    눈물납니다

  • 행복하다님 한테 씨언어좀 배워야 할듯 엉엉 ㅎㅎ;
    갑자기 씨언어를 성급하게 했다는 생각이 드는 감이 .. 흑흑
  • No Profile

    ㅋㅋㅋ 전 야매 랍니다.. ㅋㅋ 뭐 똑바로 아는 건 하나도 없어요,.., ㅋㅋ

    전부 대충.. ㅋㅋ 그러다가 모르면 네이버 지식인 누나 한테 좀 물어 보고.. ㅋㅋ

    그렇게..;; 하구 있는데;; ㅋㅋ

  • No Profile

    올리신지 꽤 오래된 질문같은데.....ㅎㅎ 이런곳도 있었군요....
    프로그래밍이라.....문법도 중요하고..포인터도 중요하죠.........

    이제 제 생각을 좀 써보려구요..
    저도 아무래도 하드웨어 보다는 소프트웨어인 프로그래밍에 더 많은 시간을 투자했었기 때문에..
    C/C++을 공부하는 사람들로부터 이런 이야기들을 조금은 들어봤던거 같구요..
    C에 대한 다른 이야기 들도 풀어보자면 너무 많을 듯 해서...다 줄이고 포인터에 대해서만 이야기 해 보도록 하죠..
    제 생각은 우선..포인터가 뭔지 알기 전에....도대체 포인터가 어디에 많이 사용되는지를 알아야 할 것 같군요..
    또 하나는 포인터를 이해 못했다고 괴로워할 필요는 없다..!! 라는 거구요....그 이유는 뒤에 써보렵니다.

    우선..첫번째 부분에 대해서 이야기 해 보도록 합니다..
    포인터를 어디에 많이 사용할 까요...일반적으로 포인터를 공부하려고 책을 보면...
    어떤 함수 안에서...

    int a ;
    int b ;
    int *pa ;

    pa = &a ;
    *pa = 100 ;

    b = *pa ;

    대충 이런 류의 소스를 포함하고..설명하고들 있지요...
    그래서 포인터가 은행의 계좌랑 비스꼬롬 하다..등등..이런저런 비유를 하고 설명을 하곤 하죠...
    그리고 나선 별다른 이야기 없이...함수에 대한 설명을 합니다...그래서 좀 처음 보는 사람들이 답답해 하는듯 합니다.

    이제 첫번째 질문의 본론으로 들어가 보려합니다.

    도대체 포인터를 어디에 쓰는 건가요?

    제가 생각하는 답은 이렇습니다. 함수의 매개변수 전달을 단순하게 하려고 사용합니다.
    물론 함수의 시작위치를 포인터로 받아놓고 ...그 녀석(함수)을 호출하려고도 많이 사용합니다 만은...
    그리고 다른데도 어느정도 사용되 겠지만.....  우선 제가 생각하는 가장 큰 부분은 "함수간의 매개변수 전달" 이라고 봅니다.
     
    그러면 함수의 매개변수 전달방법을 나열해 보면...3가지가 있지요..
    Call by Value, Call by Reference, Call by Pointer 이렇게 세가지가 있습니다.

    음 좀..길어지네요...다음 댓글에서 이어서 올려봅니다.

  • No Profile
    우선 Call by Value 에 대해서 잠시 보도록 합니다...
    이녀석은..어떤식으로 사용하냐면..

    int foo( int a, int b)
    {
        return a + b ;
    }

    이런식으로 선언해 놓고....

    int main(void)
    {
         int a, b, c ;
         a = 100;
         b = 20 ;
         c = foo( a, b ) ;
    }

    이런식으로 호출하지요...
    이녀석의 특징은 뭐냐면.....foo라는 함수를 호출할 때 메인의 a, b의 값을(100, 20)을 함수 foo의 a와 b에 복사하면서
    시작합니다. foo의 결과는 120 이겠지요.....만일 foo 내의 함수에서 a, b값의 죽어라고 고쳐도...main함수내의 a, b에는
    전혀 영향을 미치지 않습니다. 즉 아주 독립적이라는 이야기지요...아래의 그림을 참조하세요..
    callbyvalue.GIF

    그런데...만일 ...제가 foo라는 함수내에서 main함수내의 변수를 바꿔야 할 필요가 생겼다 라고 가정합시다..
    (뭐 프로그램을 짜다 보면...많은 경우의 수가 있으니깐요...)
    이럴 때 사용할 수 있는 방법이 Call by Reference 와 Call by Pointer 입니다...
    음 마눌님이 전화를 하셔서...집에 들어가 봐야 겠습니다...들어가서 이어서 올려보도록 하죠...
  • No Profile

    이제..call by reference 를 봐야 할 거 같군요...이건 call by value하고는 좀 다르게...
    호출된 함수에서도 레퍼런스 변수만 연결되어 있으면 얼마든지 호출한 함수의 변수값을 바꿀수 있지요..예를들어..
    위의 댓글에서 만들어놓은..소스를 조금만 바꿔보도록 하죠..

    void foo( int &a, int &b)
    {
        a = 10;
        b = 200 ;
    }

    이런식으로 선언해 놓고....

    int main(void)
    {
         int a, b, c ;
         a = 100;
         b = 20 ;
         foo( a, b ) ;
    }

    이렇게 쓰게 되면 메인함수의 a와 b는 각각 100과 20 에서 함수호출후 10과 200으로 바뀌게 됩니다..
    간단히 그림으로 표현하면..

    callbyref.GIF
    다음과 같은 형태가 됩니다...즉 foo함수내의 a와 b의 변수는 main문의 a와 b의 변수를 참조하고 있습니다.
    foo에서 a에 값을 대입하면 자동으로 main문의 a가 변하는 거죠.
    이거 포인터 설명하려다...초가삼간 태우는거 같은 느낌이 들정도로 길어지긴 하지만..어쨌든간에 시작한거니..마무리는
    지어야 할거 같군요.. rabbit%20(28).gif  어쨋든..다음댓글로 이어집니다...

  • No Profile

    이제..call by pointer입니다.....우선 저 위쪽에서 포인터가 주로 사용되는 부분을 말씀드렸던거 같습니다.
    "함수의 매개변수 전달을 단순하게 하려고 사용합니다." 이렇게요..
    포인터 변수 전달방법에서도 마찬가지로 호출된 함수에서 얼마든지 호출한 함수의 변수값을 바꿀수 있지요..
    이번에도 만들어놓은..소스를 조금만 바꿔보도록 하죠..

    void foo( int *a, int *b, int *c, int *d, int *e)
    {
        *a = 10;
        *b = 200 ;
        *c =1;
        *d= 2;
        *e=3;
    }

    이런식으로 선언해 놓고....

    int main(void)
    {
         int a, b, c ,d,e;
         foo( &a, &b, &c, &d, &e ) ;
    }

    이렇게 쓰게 되면 메인함수의 a와 b, c, d, e는 각각 먼지 모를 값들 에서  함수호출 후 10과 200, 1, 2,3 으로 각각바뀌게 됩니다..
    간단히 그림으로 다시 표현하면..

    callbyPoint.GIF
    위의 설명은  내부적으로 모냥만 약간 다르고 CallbyReference 랑 똑같은 기능을 하는데 왜 CallbyPointer를 사용할 까요.
    만일 main에서 foo를 호출하는데 변수가 500개 라고 생각합시다...
    그럼 500개 변수를 다 만들고..각각 다 참조형이나 포인터를 사용할 수 도 있을겁니다..ㅡㅡ
    그런데 이렇게 하면 너무 비효율적이죠...그래서 배열이라는 것을 생각했고...
    이 배열을 포인터를 사용하면 호출된 함수에서 사용할 수 있고 또한 소스도 각각 500개 변수를 넣어주는 거 보다 훨씬
    짧아질 겁니다..

    또 너무 길어져서 다음댓글로 갑니다..

  • No Profile
    이제 여기서 포인터의 존재이유를 약간 수정하겠습니니다...
    "함수의 매개변수 전달에서 배열을 간단하게 전달하려고 사용한다" 로 약간 정정합니다..
    물론 포인터를 사용하는 응용부분이야 많습니다만...처음 C를 공부하실 때는 포인터를 위의 목적으로만 생각하시면
    충분할 듯 합니다......다르게 사용되는 부분은 특별히 많지 않아서.......공부하시기에 더 좋지 않다라고 생각됩니다.
    어쨌든 간에..

    void foo( int *a)
    {
         int i ;
         for( i = 0 ; i < 100 ; i++ )
         {
                 *(a+i) = i ;
         }
    }

    이런식으로 선언해 놓고....

    int main(void)
    {
         int a[100] ={0,};
         foo( a) ;
    }

    foo는 int* 형을 받아야 하는데 메인에서 호출한 foo(a)는 배열 a의 이름 만 썼죠...이거 부터 약간 설명 드려야 할 거
    같군요...배열의 이름 만 사용을 하면 "&배열이름[0] " 즉..배열의 첫번째 요소의 주소가 넘어가게 되죠..
    다시 이야기 하면 배열의 시작위치를 넘겨주면서  foo함수를 호출하게 됩니다..
    foo함수 에서는 *(a+i) 라는 곳에 i 값을 넣어줬죠....즉 foo함수가 호출된 후에는 main의 배열에 차례대로
    0부터 99까지의 숫자가 들어가 있게 될 겁니다.....
    이처럼 포인터는 변수 100개를 아주 짧고 간단하게 호출하는 함수로 연결해 줄 수 있는 방법 중 하나입니다..
    여기에서 *(a+i)  는 a[i] 와 똑같은 의미를 갖습니다. ..

    그래서 저같은 경우는 함수의 매개변수로 배열을 넘겨야 할 때 ...이런식으로 사용합니다..

    void foo( int *a)
    {
         int i ;
         for( i = 0 ; i < 100 ; i++ )
         {
                 a[ i ]  =  i  ;
         }
    }

    int main(void)
    {
         int a[100] ={0,};
         foo( a) ;
    }


    즉 메인에서 변수를 선언해 놓고...호출될 함수는 포인터변수로 받고...
    호출된 함수에서 포인터 변수를 사용할 때는 그냥 배열로  a[ i ] 와 같은...형태로 사용합니다..
    이게 제일 소스를 알아먹기가 편하더군요....

    다음 댓글에서 마지막 정리를 하겠습니다.
  • No Profile
    이제 드디어 제가 하고 싶은 말을 쓸 수 있겠군요....

    C/C++ 언어를 공부할 때 포인터의 의미만 파려고 생각하지 말고
    언제 어떤 상황에서 포인터가 사용되는지를  먼저 아는게 중요하구요...
    포인터가 사용되어야 할 상황을 알고 있다면 그 상황에서 포인터를 사용하는 여러가지
    표현중에서 한가지만......사용하시는 방법을 정해 놓으시면..포인터를 굳이 깊게 공부하지
    않으셔도 전혀 상관 없습니다.


    그리고 일반적으로 포인터를 사용하는 경우는 배열형 변수를 함수의 매개변수로 넘기는 것에 ...
    가장 포인터가 많이 사용된다고 말씀드렸던거 같군요...다른 경우도 있지만..공부하시는 입장에서는..
    이것만 알면 충분합니다..


    그렇다면...배열형 변수를 함수의 매개변수로 사용하는 방법을 하나 정해 놓고 변수를 넘길 때 그리고 호출된 함수
    에서 사용될 때 똑같은 방법으로 사용하시면 되겠군요...저 같은 경우는 ...제일 마지막에 써놓은 소스 처럼만..
    포인터를 사용합니다...물론 다른 표현법은 알고 있지만...(남의 소스를 볼때 이해는 하지만) 제 가 직접 그런 표현은..
    사용하지 않고 있습니다..

    프로그램을 만드는데 있어서 가장 중요한 것은 어떤 언어의 문법적인 지식이 아니라 구현하고자 생각하고 있는
    어떤 내용을 ....프로그래밍적인 구조로 구현할 수 있느냐 없느냐의 문제 입니다.....글로만 쓰니깐..표현이힘드네요.

    어쨌든 간에...우리가 for, if, while, 연산자, 포인터..등 등의 기능을 가지고 있는 기기를 가지고 있다고 가정하죠..
    그 기기를 잘 조합하면 어떤 물건을 만들어 낼 수 있습니다. ...어떤 물건을 만들기 위해 모든 기능을 알아야 하는 건
    아니라고 봅니다...기본적인 기능들을 어떻게 구조적으로 잘 나열하느냐가 제일 중요한 문제인 듯 싶습니다.
    포인터도 마찬가지로 어떤 구조의 흐름을 위해 부품처럼 사용되는 하나의 기능에 불과 합니다...
    그 부품을 사용하는 잘 방법만 알고 있으면 충분할 것이라고 생각됩니다.

    PS : 물론 지금까지의 이야기는 저의 개인적인 사견 일 뿐이니깐....너무 무서운 트집은....사양하겠습니다..
    그냥 저의 개인적인 생각 정도로만 받아들이시면..될거 같습니다.
  • No Profile
    요새 commidi님이 열심히 해주셔서 제가 감사하네요..

    바빠서 전 활동이 뜸한데 말이죠;;
  • No Profile
    글쓴이 あさひ 08.02.02 16:25 댓글 좋아요 0 싫어요 0
    워~~~ 콜바이 밸류 ... 콜바이 레퍼런스 음......이것까지는알겠습니다...콜바이 포인터는 모릅니다ㅡㅡ;;
  • No Profile

    저도 C배울 때 난관 중 하나가 포인터였군요.  이 글 보는 사람이 있을까 모르겠는데...

    어셈블리 보시면 명령 인자로 딱 3가지 있습니다.

    1. CPU안의 레지스터,
    2. 직접 값을 써 준다,
    3. 어떤 메모리 공간의 위치

    즉 C언어의 경우 우리가 쓰는 변수의 이름만으로 주소를 알아서 처리해주는 거지요.
    매트릭스 식으로 이야기하면 숟가락은 없는거고, C언어 식으로 이야기하면 변수같은 건 없는겁니다.

  • No Profile
    핡;;  어렵네요.ㅠㅠ 씨책을 펼쳐놓긴햇는데..이거원.ㅋㅋ
  • No Profile
    포인터 사용은 고급(어려운) 기술이라서 초보자프로그램에서는 보기 어려울겁니다. 숙련자나 전문가의 프로그램 예를 보시면 쓰는 곳을 찾을수 있을겁니다.저는 주로
    마이콤의 register를 정의할 때 사용합니다. 기억이 가물가물한데 가령 Porta가 0x200 번지라 하면 #define  porta (*(volatile byte *)(0x200 ))이런식으로 하면 c에서
    porta=0xaa 이런식으로 쓸수 있습니다.마이컴 컴파일러의 header file을 보면 아마 위같은 방식으로 register가 선언되어 있을겁니다. 단 컴파일러마다 형식은
    다를수 있습니다.

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
367 자유주제 HOT정모 대비.. 아크마 3020 2008.02.20
366 자유주제 HOT점심 토크! (그냥 주절주절 + 투덜투덜 )4 naemaum4u 2810 2008.02.20
365 자유주제 HOT오랜만이네요.. ㅋㅋㅋㅋ;;;2 행복하면 3005 2008.02.12
364 자유주제 HOT128보드 추천해주세요..2 あさひ 6210 2008.02.12
363 자유주제 HOT무자년 새해 복많이 받으시길.. あさひ 2869 2008.02.09
362 자유주제 HOT여러분 모두 새해복 많이 받으세요~!3 환상 2597 2008.02.08
361 자유주제 HOT다들 오랫만이에요 ㅋㅋㅋ1 빠라삐리뽀 2633 2008.02.05
360 자유주제 HOT사진 어캐 올리죠?2 빛나는 영혼 2643 2008.02.04
359 자유주제 파워서플라이 회로도 입니다 . 뺘쑝 9 2008.02.04
358 자유주제 HOT휴......리눅스 ㅋ3 뱀뷀뷀 8098 2008.01.31
357 자유주제 HOT올린곳이 정확히 없어서...6 날뽕녀 2653 2008.01.30
356 자유주제 HOTXScale 스타트~4 뱀뷁뷁 3449 2008.01.25
355 자유주제 HOT초기화면을 보다보니..9 commidi 4704 2008.01.24
354 자유주제 HOTㅋㅋ 모두들.. 즐거운 월요일이 왔어요~~ㅋㅋㅋ;;;5 행복하면 2908 2008.01.21
353 자유주제 HOT부탁을...5 빵콕 2569 2008.01.20
352 자유주제 HOT행복한 주말............2 날뽕녀 6780 2008.01.19
351 자유주제 HOTFilter Solutions 툴은 어디에??8 빛나는 영혼 4058 2008.01.18
350 자유주제 HOT앗싸~~5 빛나는 영혼 2691 2008.01.18
349 자유주제 HOT안녕하세요^^4 로봇마스터 3021 2008.01.15
348 자유주제 HOT오랫만이에요..1 비희 2684 2008.01.15
  • 호기심이란 무지의 고백인데 그것은 의도적이면 당당하며 열렬하다.
    - 루빈슈티안
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.