|
포인터의 장점은 배열처럼 미리공간할당을 할필요가 없는것이 아닙니다.
미리공간할당을 안할경우 동적할당이라는것을 해야합니다.
또는 포인터는 미리 할당된공간을 편리?하게 사용하기 위해서 사용하죠..
예제로~
int i = 0;
int* i2;
여기서 i2는 4바이트의 공간을 가지고있습니다.(모든 포인터는 4바이트인거 아시죠)
그러나 주소는 가르키고 있지않습니다. 0x000000 뭐 이런식의 주소를 가지고있겠지요
그래서 이것을 사용할수없습니다. 사용할경우 에러가 나겠지요
그래서 대의님은
이런식으로 i2에 i의 주소를 넣었지요
이럴경우 i2는 i의 주소를 가지고있기때문에 마치 i를 사용하느냥 사용할수있죠
값을출력하면 i의 값이 나올듯하구요
설명하신내용중에
"제가 위에서 설명한 내용은 in+i는 주소가 할당이 되었고 쓰레기 주소가 아니란 예기를 한건데.."
라고하셨죠 어디서 주소를 할당했다는것이죠? 또는 공간을 말입니다.
그런데 공간을 할당했다는것이 안보이네요
무슨언어를 먼저접해보셨는지 모르나 c같은경우 불편할지도 모르지만 직접적으로 공간을 할당해주셔야합니다. 전에도 말슴들렸듯이 그러지않을경우 무슨에러가 날지 예측할수없죠
뭐 설명은.. 계속 하면 반복될것같으니그래도 이해가 안가시면
yusch@hotmail.com 으로 연락주세요 msn입니다.
]
아차차 아직 배우신지 오래된거같지않은데 포인터의 장점은엄청납니다. 다른언어보다 뛰어나다고 생각되는것이 포인터때문이죠 물론 그때문에 어려워진것도 있습니다. 그래서 새로운언어들은 포인터라는 개념들을 뺼려고 하는거 같더군요~
김대의 님이 쓰신 글 :
: 님이 잘못됬다는 애기로 들으셨다면 죄송하고요. 전 제가 배운것이 틀린것처럼 말씀하시니까..
: 그동안 배운게 잘못됬다고 생각해보세요. 돈은 물론이거니와 시간에 ......열 받잔아여..ㅜㅜ
: 자세히 알아가서 선생에게 따져야져.그러니 좀 이해가 갈수 있게 설명좀 해주십시요.
: 본론으로 들어가서...
: 제가 설명한게 맞다면...제가 위에서 설명한 내용은 in+i는 주소가 할당이 되었고 쓰레기 주소가 아니란 예기를 한건데...님께서 위 설명이 맞다고 하시면 in+i에는 주소가 할당이 안됬다고 하시니까...이상한 애기 아닌가요???.... 왜 그런지 확실히 좀 설명좀 해주세요.
: 한가지 질문더. 포인터를 사용하면서 배열로 공간할당을 해야한다고 하시는데..
: 또 여기서 제가 배운것이 틀리다는 말씀이신데요..
: 제가 배운건..포인터의 장점은 배열처럼 미리 공간할당을 할필요가 없고, 공간의 크기를 사용한만큼만 사용할수 있고, 이런 이유에서 프로그래머들이 포인터를 사용한다는걸 배웠습니다.
: 그런데, 님께서 말씀하신 배열로 공간할당을 한다면 그 주어진 공간이외에는 사용할수 없기 때문에 포인터의 의미가 없지않나요.즉 배열과 같다는 설명으로 들리는데..???
:
: scanf("%d",(in+i) ); 에서
:
:
: : 에... 님꼐서 설명하신게 맞지요
: : 올리신소스를 보면서 설명?해볼꼐요
: :
: : #include <stdio.h>
: : #include <conio.h>
: :
: : void main(void)
: : {
: : int inp, i = 0;
: : int *in = &inp;
: : // 여기서 in은 inp의 주소를 얻어옵니다.
: : // in 을 출력하면 inp의 주소를 보여주겠지요
: : // *in을 하면 inp가 가지고있는 값을 보여주지요
: : //뭐 다아시는내용이겠죠
: : clrscr();
: :
: : for(i=0;i<5;++i){
: : scanf("%d",(in+i) );
: : //값을 받습니다. 문제는 역기서 값을 집어넣는것인데요
: : // (in + i) 에 값을 집어넣겠지요
: : // 그런데 문제는 그주소? 에 해당하는곳을 위에서 컴파일러에게 알려주지않았습니다.
: : // 위에 선언은 오로지 inp만을 알려주었죠 아시겠지만 배열로 하게되면 연속적으로
: : // 공간을 할당(?) 해주죠. 그런데 그렇게 하지않았으니 이곳(주소)가 무엇을 하는지 알수없습니다.
: : // 컴파일러에서 사용중인지 또 운영체제에서 사용중인지 또는 알수없는곳에서 사용할지
: :
: : printf("\n : %d", *(in+i)); }
: : getch();
: : // 에러는 대부분 종료할떄 날것입니다.
: : // 모든 공간은 프로그램이 종료되면 돌려주게 되있겠죠
: : // 그런데 종료시 없애는과정에서 이곳(in + i 의주소) 이 사용중일수도 있는것이죠
: : // 또는 후에 사용할수도 있죠
: : // 위에서 공간을 할당?하지않았으니까 그곳이 안전한곳인지 보장할수없죠
: : // 그래서 디버그때와 릴리즈 일떄 에러가 다르게 날것이며
: : // in + i 에서 i에 따라서(그주소에따라서) 안날수도있습니다.
: : // 또 사용컴퓨터에따라 안날수도있죠... 그러니 안전하게 하셔야되겠죠
: :
: : }
: :
: :
: : 뭐 대충설명했는데요 잘전달되었는지는 모르겠네요.. 용어를 잘몰라서요.. 대충 느낌대로 용어를 선택했습니다.-_-
: :
: : 어찌되었든 님께서 배우신것은 잘못된게 없습니다. 그러나 사용에는 문제가 있습니다.
: : 언어에서 변수선언의 이유중에 공간할당이라는 이유가 있을것입니다. 변수선언없이
: : 분명 실시간으로 필요한곳에 변수를 사용할수도 있겠죠 뭐 몇몇언어나 스크립트는 이런식이겠죠
: :
: : 그러나 이렇게 하면 속도가 느려질듯합니다. 뭐 설명은 이상하지만.....
: :
: : 근데 김대의님은 위에서 부터보니깐 다른사람이 지적해준문제를 잘안받아들이시는거 같에요.
: : 물론 대의님께서 배우신대로 말씀하시고 아시는대로 말씀하셨지만... 왠지 알려주는사람이 잘못됬다고 그러시니깐.. 기분이 좀...그렇네요 ^^
: :
: :
: : 뭐 제가 틀렸을가능성이 높지만 대의님께서 하시는방법으로 안하시는것이 분명 좋습니다.
: :
: :
: :
|