|
답변 감사합니다.
근데 문제는 C언어에는 new 연산자가 없지 않나요?
C++로 프로그래밍을 하는 게 아니거든요..
남병철.레조 님이 쓰신 글 :
:
: 매일 하나씩 답변을 달려구 노력하는 레조입니다;;
: 몇일전에 본 글인데 이제 답글을 쓰네요 ^^;;
:
:
: : void change_it(int a[])
: : {
: : int i=777, *q=&i;
: : a=q;
: : }
:
: 일단 위의 change_it 함수로 포인터를 넘겨서 새로운 주소를(어떤의도에서든..--;)
: 받아오고 테스트를 하고싶은것 같은데...
: change_it에 한가지 문제가 있네요.
: 인자로 들어오는 포인터 변수는 문제가 없겠지만 그 변수에 바꾸려는 주소를 대입할때
: change_it 내부의 변수 어드레스를 사용했습니다.
: 이는 change_it 함수가 끝났을때 그 주소는 유효하지 않기때문에 주소를 바꾸었다고
: 볼수 없겠지요...(기록은 남아 있을듯 하지만...)
:
: 포인터 변수를 인자로 넘긴후에 내부에서 새로운 값으로 할당할때는 new를 사용해보세요.
: 수정해 보자면...
: void change_it( int* a )
: {
: a = new int;
: *a = 777;
: }
: 이렇게 해놓으면 main에서 별문제 없이 사용할수 있겠지요.. 그리고 delete 하시는것 잊지
: 마시고.. ^^
:
: 그럼 change_it 말고 다른걸 살펴볼까요?
: (가장 흔한 스왑(상호바꾸기) 함수입니다.)
: [참고]
: 참조란? 같은변수의 또 다른 이름이다.
: 참조가 포인터보다 좋은점은 해제할 필요가 없기 때문에 표기법이 더 단순하고
: 컴파일러가 참조의 초기화를 강요하므로 골치아픈 포인터 실수를 범할 우려가
: 적다.
: 한편, 참조는 포인터보다 더 사용하기 쉽고 더 안전하지만 더 강력하지는 않다.
:
:
:
: #include <stdio.h>
: #include <conio.h>
:
: void swap( int&, int& ); // 선언
:
: int main()
: {
:
: int a, b;
: a = 5;
: b = 10;
:
: printf( "\na = %d b = %d", a, b );
:
: swap(a, b); // 사용
:
: printf( "\na = %d b = %d", a, b );
:
: getch();
:
: return 0;
: }
:
: void swap( int& a, int& b ) // 정의
: {
: int temp;
: temp = a;
: a = b;
: b = temp;
: }
:
:
:
: 메인의 변수를 함수 내부에서 값을 바꾼다.
: 이는 메인에서도 바꾼 내용이 적용된다.
:
:
:
:
:
: 오제호 님이 쓰신 글 :
: : 아래 프로그램은 change_it함수에서 a의 어드레스를 바꿔서
: : main으로 전달하려 하는데
: : 어떻게 전달해야 하는지좀 알려주세요.
: :
: : 가장 기본적인건데 잘 모르겠어요
: :
: : #include <stdio.h>
: :
: : void change_it(int a[]);
: :
: : int main()
: : {
: : int a[5]={0,1,2,3,4}, *p;
: :
: : p=a;
: : printf("p[1]=%d p=%p\n",p[1],p);
: :
: : change_it(a);
: : p=a;
: :
: : printf("*p=%d p=%p\n",*p,p);
: : return 0;
: : }
: :
: : void change_it(int a[])
: : {
: : int i=777, *q=&i;
: : a=q;
: : }
|