1빠네 ㅋㅋㅋㅋ
c언어을 널널하게 공부해서 다시 공부합니다 ㅋ
포인터는 1학년떄 배우질 않아서 하나도 모릅니다
강의도 듣고 했는데
도대체 이놈이 어디다가 써먹습ㄴㅣ까?
아무리 누씻고 찾아봐도 쓰이는 곳이 없네여~
궁금합니다 ㅋ
c언어을 널널하게 공부해서 다시 공부합니다 ㅋ
포인터는 1학년떄 배우질 않아서 하나도 모릅니다
강의도 듣고 했는데
도대체 이놈이 어디다가 써먹습ㄴㅣ까?
아무리 누씻고 찾아봐도 쓰이는 곳이 없네여~
궁금합니다 ㅋ
하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.
번호 | 분류 | 제목 | 글쓴이 | 조회 수 | 날짜 |
---|---|---|---|---|---|
26 | 펌웨어 & 코딩언어 | HOT모니터 정보 읽어올때 프로토콜1 | 빛나는 영혼 | 1358 | 2008.03.06 |
펌웨어 & 코딩언어 | HOT아~~20 | あさひ | 908 | 2008.01.15 | |
24 | 펌웨어 & 코딩언어 | HOT최근에 질문 받은 소스-_-;;1 | 아크마 | 761 | 2007.08.16 |
23 | 펌웨어 & 코딩언어 | HOTRS232 컨트롤 소스2 | 아크마 | 3825 | 2007.04.13 |
22 | 펌웨어 & 코딩언어 | HOT시리얼통신 데모 프로그램 소스2 | 아크마 | 3290 | 2007.04.13 |
21 | 펌웨어 & 코딩언어 | HOT시리얼통신 테스트 프로그램2 | 아크마 | 3246 | 2007.04.13 |
20 | 펌웨어 & 코딩언어 | HOT화상 캠 제어 소스5 | 아크마 | 3279 | 2007.04.13 |
19 | 펌웨어 & 코딩언어 | HOT음성변조 관련 프로그램 소스 모음4 | 아크마 | 6546 | 2007.04.13 |
18 | 펌웨어 & 코딩언어 | HOT어셈으로 구현한 암호화 복호화 - by 아크마4 | 아크마 | 2745 | 2007.08.08 |
17 | 펌웨어 & 코딩언어 | HOTC를 위한 어셈블리어22 | 아크마 | 3123 | 2007.06.06 |
16 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #16 [ 입력/출력 ]10 | 뺘쑝 | 3712 | 2007.06.02 |
15 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #15 [ 인터럽트 : DOS가 서비스를 제공하는 방법 ]5 | 뺘쑝 | 2860 | 2007.06.02 |
14 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #14 [ 스트링 작업 ]6 | 뺘쑝 | 2826 | 2007.05.24 |
13 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #13 [ 산술 연산 ]9 | 뺘쑝 | 3654 | 2007.05.24 |
12 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #12 [ 프로시저 ]9 | 뺘쑝 | 2885 | 2007.05.24 |
11 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #11 [ 제어 흐름의 구현 ]8 | 뺘쑝 | 2526 | 2007.05.24 |
10 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #10 [ 제어 흐름 ]7 | 뺘쑝 | 2645 | 2007.05.24 |
9 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #9 [ 일반 명령문 ]11 | 뺘쑝 | 3225 | 2007.05.11 |
8 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #8 [ 자료의 정의 ]8 | 뺘쑝 | 1928 | 2007.05.04 |
7 | 펌웨어 & 코딩언어 | HOT어셈블리어 강좌 #7 [ 프로그램의 처리 ]6 | 뺘쑝 | 2276 | 2007.05.04 |
초보자의 입장에서 한 말씀 드리겠습니다.
씨언어 입문할때 저도 "포인터를 왜쓸까???" 생각을 많이 했습니다.
포인터를 안써도 충분한 프로그램을 짤수 있는데 말입니다.
하지만 이 생각은 잘못된 생각입니다.
초보자들이 씨언어로 프로그램을 짠다면 과연 어느 정도의 분량이 나올까요???
아마 100~1000줄정도 될 것입니다.
이렇게 프로그램을 짜다보면 포인터의 사용이 무의미 함을 느낄 것입니다.
하지만 프로그램의 소스가 엄청난 분량을 가지면 어떻게 할까요...
일일이 변수타입을 설정해서 그 값을 일일 지정해주는 것이 좋을까요?
아니면 변수가 저장되어 있는 값의 메모리상의 주소를 가져다 쓰는게 좋을까요? <-- 포인터
아마 프로그램을 잘 짠 사람이라면 아마도 포인터를 쓰겠지요..
가장 큰 이유는 프로그램 루틴들의 효율성을 증가시킬 수 있다는 장점때문에도 아마 그럴 것입니다.
MCU에서는 C언어로 프로그램을 짤때 포인터를 거의 볼수가 없을 것입니다.
저의 생각으로는 위에서와 같이 프로그램소스가 짧기 때문에 포인터의 사용이 별로 없는 것 같습니다.
하지만 MCU에서도 프로그램을 코딩하다가 소스분량이 많아 지면 포인터를 사용하는게 좋겠지요..
아참 그리고 LCD소스 보시면 포인터를 사용하신 걸 본적이 있으실 겁니다.
바로 문자열배열과 포인터입니다.
배열과 포인터를 사용하시면 아주 편리합니다 .
결국은 포인터를 어느 정도 알고 있어야 한다는 결론이 나오내용 ^^;
아참 c언어에서 배열과 포인터의 조합은 삼합이라고 할까요 ㅎㅎㅎ
삼합보다는 흔희 꽃이라고 하니 꽃도 좋구요 ㅎㅎ
가장 핵심적인것은 매우 큰 크기의 변수를 전달할때 포인터를 사용하면 고작 4바이트면 데이터에 액세스할 수 있다는 것이겠지요^^;;
전 포인터를 좋아하는 타입인지라..ㅅㅅ
포인터는 꼭 필요하지는 않습니다.
포인터를 사용을 안하더라도 코드는 구현을 할 수 있습니다.
하지만 소스의 길이는 길어지겠죠!?
그리고 아직 제가 하드웨어 쪽으로 거의 공부를 안해서
모르겠는데..;; 위에 빠숑님 말 처럼 mcu에서는 거의 포인터를 사용을 할 일이 없습니다.
mcu에서는 거의 바로 주소로 접근을 해서 그런거 같기도 같고, 메모리 용량이 크지도 않기 때문에..
그런거 같기도 같고.. ㅋㅋ 그냥 이건 제생각..ㅋㅋ
하지만.. 하드웨어에서 c언어를 사용하는 것이 아니라.. 일반 소프트웨어 적으로 코딩을 할때는
c언어에서 포인터를 사용하는 이유는 아크마님 말처럼.. 프로그램이 간결해 지기 때문에 사용을 많이 한답니다.
그래서 조금 긴 프로그램 주소록 프로그램정도만 짜도 포인터가 많이 쓰이는 것을 보게 될껍니다.
그래서 c언어 조금만.. 공부 하시다가 보면.. 포인터의 쓰임새에서는 하두 많이 써서 자연스럽게
익힐 수 있을꺼 같네요;;
하지만 포인터를 사용하기 위해서는 확실히 이해를 하고 사용을 하셔야 됩니다.
포인터에 대한 에러는 정말 잡기가 힘듭니다..ㅋㅋㅋ;;
그러므로 포인터는 !! 꼭 필요한 것은 아니지만.. 안쓰면 안되는 것이기에.. 필요하다는 말;; ㅋㅋ
이상.. 잠이 덜 깬상태에서 주절주절 이였습니다..;;
이거 잠깨고 보면.. 이상할꺼 같앵..ㅠㅠ;;
혹시 포인터로 만드신 간단한 프로그램 있음 보여 주세요 .
궁금합니다 어떻게 쓰여지는질..
모든 비밀은 정모에서...ㅋㅋㅋ to be continued
아니 아크마님 ㅋㅋㅋ
저 알잔습니까 ...
영어 땜에 고향에도 못내려가는 처지인데 ㅜㅜ
게다가 학생에다가 ㅜㅜ
눈물납니다
갑자기 씨언어를 성급하게 했다는 생각이 드는 감이 .. 흑흑
ㅋㅋㅋ 전 야매 랍니다.. ㅋㅋ 뭐 똑바로 아는 건 하나도 없어요,.., ㅋㅋ
전부 대충.. ㅋㅋ 그러다가 모르면 네이버 지식인 누나 한테 좀 물어 보고.. ㅋㅋ
그렇게..;; 하구 있는데;; ㅋㅋ
올리신지 꽤 오래된 질문같은데.....ㅎㅎ 이런곳도 있었군요....
프로그래밍이라.....문법도 중요하고..포인터도 중요하죠.........
이제 제 생각을 좀 써보려구요..
저도 아무래도 하드웨어 보다는 소프트웨어인 프로그래밍에 더 많은 시간을 투자했었기 때문에..
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 이렇게 세가지가 있습니다.
음 좀..길어지네요...다음 댓글에서 이어서 올려봅니다.
이녀석은..어떤식으로 사용하냐면..
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에는
전혀 영향을 미치지 않습니다. 즉 아주 독립적이라는 이야기지요...아래의 그림을 참조하세요..
그런데...만일 ...제가 foo라는 함수내에서 main함수내의 변수를 바꿔야 할 필요가 생겼다 라고 가정합시다..
(뭐 프로그램을 짜다 보면...많은 경우의 수가 있으니깐요...)
이럴 때 사용할 수 있는 방법이 Call by Reference 와 Call by Pointer 입니다...
음 마눌님이 전화를 하셔서...집에 들어가 봐야 겠습니다...들어가서 이어서 올려보도록 하죠...
이제..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으로 바뀌게 됩니다..
간단히 그림으로 표현하면..
다음과 같은 형태가 됩니다...즉 foo함수내의 a와 b의 변수는 main문의 a와 b의 변수를 참조하고 있습니다.
foo에서 a에 값을 대입하면 자동으로 main문의 a가 변하는 거죠.
이거 포인터 설명하려다...초가삼간 태우는거 같은 느낌이 들정도로 길어지긴 하지만..어쨌든간에 시작한거니..마무리는
지어야 할거 같군요.. 어쨋든..다음댓글로 이어집니다...
이제..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 으로 각각바뀌게 됩니다..
간단히 그림으로 다시 표현하면..
위의 설명은 내부적으로 모냥만 약간 다르고 CallbyReference 랑 똑같은 기능을 하는데 왜 CallbyPointer를 사용할 까요.
만일 main에서 foo를 호출하는데 변수가 500개 라고 생각합시다...
그럼 500개 변수를 다 만들고..각각 다 참조형이나 포인터를 사용할 수 도 있을겁니다..ㅡㅡ
그런데 이렇게 하면 너무 비효율적이죠...그래서 배열이라는 것을 생각했고...
이 배열을 포인터를 사용하면 호출된 함수에서 사용할 수 있고 또한 소스도 각각 500개 변수를 넣어주는 거 보다 훨씬
짧아질 겁니다..
또 너무 길어져서 다음댓글로 갑니다..
"함수의 매개변수 전달에서 배열을 간단하게 전달하려고 사용한다" 로 약간 정정합니다..
물론 포인터를 사용하는 응용부분이야 많습니다만...처음 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 ] 와 같은...형태로 사용합니다..
이게 제일 소스를 알아먹기가 편하더군요....
다음 댓글에서 마지막 정리를 하겠습니다.
C/C++ 언어를 공부할 때 포인터의 의미만 파려고 생각하지 말고
언제 어떤 상황에서 포인터가 사용되는지를 먼저 아는게 중요하구요...
포인터가 사용되어야 할 상황을 알고 있다면 그 상황에서 포인터를 사용하는 여러가지
표현중에서 한가지만......사용하시는 방법을 정해 놓으시면..포인터를 굳이 깊게 공부하지
않으셔도 전혀 상관 없습니다.
그리고 일반적으로 포인터를 사용하는 경우는 배열형 변수를 함수의 매개변수로 넘기는 것에 ...
가장 포인터가 많이 사용된다고 말씀드렸던거 같군요...다른 경우도 있지만..공부하시는 입장에서는..
이것만 알면 충분합니다..
그렇다면...배열형 변수를 함수의 매개변수로 사용하는 방법을 하나 정해 놓고 변수를 넘길 때 그리고 호출된 함수
에서 사용될 때 똑같은 방법으로 사용하시면 되겠군요...저 같은 경우는 ...제일 마지막에 써놓은 소스 처럼만..
포인터를 사용합니다...물론 다른 표현법은 알고 있지만...(남의 소스를 볼때 이해는 하지만) 제 가 직접 그런 표현은..
사용하지 않고 있습니다..
프로그램을 만드는데 있어서 가장 중요한 것은 어떤 언어의 문법적인 지식이 아니라 구현하고자 생각하고 있는
어떤 내용을 ....프로그래밍적인 구조로 구현할 수 있느냐 없느냐의 문제 입니다.....글로만 쓰니깐..표현이힘드네요.
어쨌든 간에...우리가 for, if, while, 연산자, 포인터..등 등의 기능을 가지고 있는 기기를 가지고 있다고 가정하죠..
그 기기를 잘 조합하면 어떤 물건을 만들어 낼 수 있습니다. ...어떤 물건을 만들기 위해 모든 기능을 알아야 하는 건
아니라고 봅니다...기본적인 기능들을 어떻게 구조적으로 잘 나열하느냐가 제일 중요한 문제인 듯 싶습니다.
포인터도 마찬가지로 어떤 구조의 흐름을 위해 부품처럼 사용되는 하나의 기능에 불과 합니다...
그 부품을 사용하는 잘 방법만 알고 있으면 충분할 것이라고 생각됩니다.
PS : 물론 지금까지의 이야기는 저의 개인적인 사견 일 뿐이니깐....너무 무서운 트집은....사양하겠습니다..
그냥 저의 개인적인 생각 정도로만 받아들이시면..될거 같습니다.
바빠서 전 활동이 뜸한데 말이죠;;
저도 C배울 때 난관 중 하나가 포인터였군요. 이 글 보는 사람이 있을까 모르겠는데...
어셈블리 보시면 명령 인자로 딱 3가지 있습니다.
1. CPU안의 레지스터,
2. 직접 값을 써 준다,
3. 어떤 메모리 공간의 위치
즉 C언어의 경우 우리가 쓰는 변수의 이름만으로 주소를 알아서 처리해주는 거지요.
매트릭스 식으로 이야기하면 숟가락은 없는거고, C언어 식으로 이야기하면 변수같은 건 없는겁니다.