아래의 코드는 hi라는 string를 가리키고 있는 포인터 p를 changeAddress로 넘긴다. 그러나 changeAddress로 받을 때, char* q라는 포인터를 만들고 여기에다가 포인터p가 가진 hi의 시작 주소값을 저장한다. 그러므로 q의 주소를 암만 바꿔봤자, main함수의 포인터p에 저장된 주소값은 바뀌질 않는 병크가 터진다. 다르게 응용하면 자료구조에서 어떤 자료를 찾기위해서 주소값을 리턴받는다고 가정하자. 함수는 하나의 값만 리턴받을수 있으므로, 주소값을 리턴 받아서 해야지 하는 생각은 ㅄ짓이다. 여러개의 값을 리턴받기 위해선 call-by-reference가 꼭 필요하다. 지금 아래의 코드는 call-by-value로써 복사한후에 처리를 하기때문에 input인자로 output을 받을순없다.
  
#include <iostream>
#include <string>
using namespace std;
char* ch = "hello";
void changeAddress(char *q ){
	q = new char[strlen(ch)+1];
	strcpy(q,ch);

}

void main(){
	char *p = "hi";
	changeAddress(p);

	cout<<p<<endl;
//출력결과--- hi
}
아래는 함수호출시 포인터를 넘기고, 넘긴 포인터의 주소를 변경하기위해서 이중포인터를 사용하였다.

이중포인터이기에 *q를 이용하면 p에 저장된 주소를 바꿀수 있고

**q를 하면 hi에 접근할수 있다.

#include <iostream>
#include <string>
using namespace std;
char* ch = "hello";
void changeAddress(char **q ){
	*q = new char[strlen(ch)+1];
	strcpy(*q,ch);

}

void main(){
	char *p = "hi";
	changeAddress(&p);

	cout<<p<<endl;
//출력결과 hello
}

 이 방법 말고도 같은 메모리 주소에 또 다른 이름을 붙일수 있는 reference를 이용해도 된다.

개인적으로 이방법이 젤 깔끔하고 쉬운것 같다.



#include <iostream>
#include <string>
using namespace std;
char* ch = "hello";
void changeAddress(char *(&q) ){
	q = new char[strlen(ch)+1];
	strcpy(q,ch);

}

void main(){
	char *p = "hi";
	changeAddress(p);

	cout<<p<<endl;
	int i =5;
	int *b=&i;
	int **a=&b;
	a=&b;
//출력결과 hello
}
이 코드들은 함수 호출시 동적배열을 하는데, 메모리 해제를 하지 않아 메모리 누수가 발생하므로 그리 좋은 예제는 아님을 밝혀둔다.

설정

트랙백

댓글