char * 과 char ** 의 수정
글쓴이: alwaysN00b / 작성시간: 수, 2006/03/01 - 3:45오전
제목이 좀 이상한데...
그동안 '잘' 이해했다고 믿은 포인터가 궁금증을 낳게 하는군요..
int foo1(char *a){ a = malloc("foo1"); if(a != NULL) return 0; else return -1; }
int foo2(char **a){ *a = malloc("foo2"); if( *a != NULL ) return 0; else return -1; }
위 두 함수는 서로 다른 것인가요?
Forums:
Re: char * 과 char ** 의 수정
예 다른겁니다... char* a 라고 하면 a에는 a가 가리키는 메모리 주소만이 복사가 됩니다. a가 가리키는 메모리주소값 자체를 고치고 싶다면 char** a가되어야 하거든요
c에서는 정확하게 call by reference 가 없습니다... call by value 를 통해 call by ref 를 흉내낼 뿐이죠
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
[quote="정태영"][quote="alwaysN00b"]제목이 좀 이
아, 정말 시원한 답변 감사드립니다. :D
언제나 시작
c에서 call by reference
c에서 call by reference 가 되죠...
Passing by Reference 가 안되죠..
----------------------------------------------------------------------------
passing by reference ?
passing by reference 와 call by reference 의 차이점이 무었인가요?
확실히 몰라 답변 부탁드립니다.
ps. passing by value 와 call by value 의 차이점은 무엇인지요?
언제나 시작
아래
아래 잘설명된거같네요..
이상하네글이 다안타나나...
----------------------------------------------------------------------------
그리고 위와같이
그리고 위와같이 C++에서 참조 연산자를 사용한다 하더라도..
실제로 내부적으로는 주소복사가 이루어지지 않나요?
그러니까 겉으로 보이기에는 Direct 같이 보이지만
실제로 내부적으로 주소가 복사되지 않고는 힘들꺼 같은데..
어디서 보기에 주소복사가되고 단지 이름만써도 그내용을 지칭하도록되어 있다고 하던데..
----------------------------------------------------------------------------
흠.. 윗글은C 와 C++
흠.. 윗글은
C 와 C++ 에서 call by reference 와 passing by reference 를 설명해 놓을 글이네요.
제가 궁금한건
진정한 개념의 call by reference와 passing by reference의 차이입니다.
C는 함수가 호출되고 리턴될때 스택을 정리하지 않습니다.
C++은 정리가 가능하죠.
그럼 윗글의 call by reference와 passing by reference 의 차이에서
스택을 정리한다는 점을 빼고 객체를 핸들링 할수 있다는건 똑같지 않나요?
물론 사용방법이 틀리지만요.
ps. passing by value 와 call by value 의 차이점은 무엇인지요?
언제나 시작
c에서는 정확히 레퍼런스가 없다는게?
c에서는 레퍼런스가 없다는게 무슨 뜻인가요?
프로그래머에게 느끼게만 해준다는 의미로 말씀하신것 같은데 궁굼해집니다.
오늘 하루두 즐거운 하루였으면 좋겠습니다.
call by reference...
가 없나요??? 궁금하네요...
포탈이는 불사신
-------------
포탈이는 불사신
위 코드는
위 코드는 생각나는대로 대충 적은 것이고,
func에서 *a 를 받아
메모리를 할당한후
확인해 보시면 처음 a값 그대로 일것입니다.
즉 *a 가 받는 값은 해당 인자의 주소값을 복사해 오는 것입니다.
그 주소값을 아무리 수정한다해도 원래 변수의 주소는 변하지 않습니다.
설명이 좀 이상하네요 ..쩝.. 내공이 부족해서..
언제나 시작
흠..
call by reference 가 안될거 같은데..
void func1(int *p) { }
void func2(int x) { }
컴파일 해보면 두 함수 모두 같습니다..
C의 포인터는 단지 특정 메모리의 주소를 정수형태와 동일하게 넘길 뿐이죠
접근 방법에 따라 차이가 있을 뿐...
두개 결과가 모두 같다고 보셔두 이해하기 편하겠네요
위에껀 call by reference 구 아래껀 call by value?
제가 보기엔 둘다 value 같은데.. 뭐 사람마다 생각은 다르겠지만요
그것보다 질문중에
그것보다 질문중에 malloc은 size_t가 인자 아닌가요 -_-
그렇죠-_-;
void *malloc( size_t size );
흠.. malloc(strlen("foo") + 1) 정도로 수정해야 할듯..
흠;
어쩌면 overloaded function 이 아닐까요 -_-;
그냥 끄적이다
그냥 끄적이다 그렇게 되버렸네요 :)
ㅡ,.ㅡ 님은 아직 답변이 없으시네요.. 쩝..
언제나 시작
흠...;
call by 레퍼런스
pass by 레퍼런스(passing by 레퍼런스 보다 이게 맞지 않을까요?)
이 두개의 차이가 뭔지는 잘 모르겠는데요...들어본적두 없구...
C언어에서는 call by 레퍼런스가 없구요(확실함. C++에서 새로나온 기능중에 포함되어 있습니다)
기본적으로 C,C++컴파일러에서는
C라고 C코드를 짜도 C++문법이 적용이 되기때문에
똑같은 결과가 나온건 아닌지...(제 추측;)
그리고
일단 제가 알기로 **는 포인터의 포인터를 갖고 있는 변수 있니다
저도 실제로 사용해본적은 있어서 잘 모르지만
넘어오는 a는 물론 문자열이겠고
함수를 call할때 인자가 몇개인지 모르는 경우(main함수나 ,printf등)
**이렇게 써줘서 인자가 몇개인지 상관없이 입력이 가능하게 해준다는군요
그리고 call by 레퍼런스란 그냥 call by 발류는 엄연히 틀립니다.
void func1(int *p) { }
void func2(int x) { }
이 두 함수가 같다고 하셨는데 사실 이 함수를 적어주실때
void func1(int &p) { }
라고 적으실껄 잘못적으신것 같구요
call by 레퍼런스와 그냥 call by 발류의 차이점은요
함수 내에서 봤을땐 똑같습니다.
그런데 내부적으로는
call by value를 했을경우
함수를 호출할때 인자로 넘겨준 변수를 복사를 해서
새로운 변수를 만들어 냅니다.
그러나
call by 레퍼런스를 했을경우
함수를 호출할때 인자로 넘겨준 변수의 메모리를 보내주고
그 함수에서는 그 메모리의 값을 참조해서 씁니다
그렇기 때문에
두 가지가 같아 보이는 이유구요(포인터와 비교되니까)
실제로 const int &등
콘스트형 레퍼런스를 쓰는 경우가 많은데
이경우에는 주로 배열을 넘겨주거나
굉장히 많이 호출되는경우에 씁니다
const int형으로 선언해서
call by value로 했을경우에
원래 있던 변수에서 새로운 변수로 복사하는 작업이 오래 걸리기 때문에
call by 레퍼런스로 해주고
const형으로 선언해서 복사하는 시간을 절약하기 위함이지요
제가 뭔가 잘못알고 있는부분이 있으면
가르쳐 주시구요
제 부족한 지식이 조금이나마 도움이 되었으면 좋겠습니다^^
또;
아 그리구요 죄송하지만
제가 kldp에 아는분이 한분도 없습니다^^;
별로 오지도 않았고
아이디도 자주 바꾸는데다가
인터넷상에서 주위사람들과 친해지기가 힘들더군요
나중에 또 보시게 되면 가끔 아는척도 좀 해주시구요
제가 리눅스는 한번도 사용해본적이 없어서
지금 겨우겨우 젠투 리눅스 설치만 해놓고
아무것도 못하고 있습니다 ㅠㅜ
도움좀 주세요^^;
읽으면 읽을 수록...
읽으면 읽을 수록 햇깔리는 포인터! 흐흠...
어렵습니다 으음.
----
일어나라! 싸워라! 그리고 이겨라!
다만!!! 의미 있는 것에 그 힘을!!!
그 능력과 노력을!!!
사람천사
댓글 달기