C++프로 그래 밍 에서 인용 형식 을 함수 매개 변수 로 하 는 방법 안내

5590 단어 C++
변수 이름 이 생 겼 는데 왜 별명 이 하나 더 필요 합 니까?C++인용 유형 을 추가 하 는 이 유 는 함수 매개 변수 로 함수 가 데 이 터 를 전달 하 는 기능 을 확장 하 는 것 입 니 다.
지금까지 우 리 는 함수 매개 변수 가 전달 하 는 두 가지 상황 을 소개 한 적 이 있다.
1)변수 명 을 실 삼 과 형 삼 으로 한다
이때 형 삼 에 게 전 달 된 것 은 변수의 값 이 고 전달 은 단 방향 이다.함수 수행 기간 에 형 삼 의 값 이 변 하면 실 삼 에 게 전달 되 지 않 습 니 다.함 수 를 호출 할 때,형 삼 과 실 삼 은 같은 저장 장치 가 아니 기 때문이다.
【예】변수 i 와 j 의 값 을 교환 할 것 을 요구 합 니 다.다음 프로그램 은 이 요 구 를 실현 할 수 없습니다.

#include <iostream>
using namespace std;
int main( )
{
  void swap(int,int); //    
  int i=3,j=5;
  swap(i,j); //    swap
  cout<<i<<" "<<j<<endl; //i j     
  return 0;
}
void swap(int a,int b) //      a b    ,    i j    
{
  int temp;
  temp=a; //  3     a b    
  a=b;
  b=temp;
}
실행 시 출력 35i 와 j 의 값 은 바 뀌 지 않 았 습 니 다.
이 문 제 를 해결 하기 위해 변수 주 소 를 전달 하 는 방법 을 사용한다.

2)변 수 를 전달 하 는 지침
형 삼 은 포인터 변수 이 고 실 삼 은 변수의 주소 이 며 함 수 를 호출 할 때 형 삼(포인터 변수)은 실 삼 변수 단원 을 가리킨다.절차
【예】포인터 변 수 를 형 삼 으로 하여 두 변수의 값 교환 을 실현 합 니 다.

#include <iostream>
using namespace std;
int main( )
{
  void swap(int *,int *);
  int i=3,j=5;
  swap(&i,&j); //        
  cout<<i<<" "<<j<<endl; //i j     
  return 0;
}
void swap(int *p1,int *p2) //       
{
  int temp;
  temp=*p1; //  3     i j    
  *p1=*p2;
  *p2=temp;
}
형 삼 과 실 삼 의 결합 은 그림 으로 표시 한다.

이러한 허실 결합 방법 은 여전히'값 전달'방식 이 고 실제 인삼 의 값 은 변수의 주소 일 뿐이다.형 삼 포인터 변 수 를 통 해 주 함수 의 변수(i 와 j)에 접근 하고 값 을 변경 합 니 다.이렇게 하면 정확 한 결 과 를 얻 을 수 있 지만 개념 적 으로 는 한 바퀴 돌 았 기 때문에 그렇게 단 도 직 입적 이지 않다.
Pascal 언어 에는'값 형 삼'과'변수 형 삼'(즉 var 형 삼)이 있 는데 두 가지 서로 다른 전달 방식 에 대응 하고 전 자 는 값 전달 방식 을 사용 하 며 후 자 는 주소 전달 방식 을 사용한다.C 언어 에 서 는'값 형 삼'만 있 고'변수 형 삼'이 없 으 며 모두 값 전달 방식 을 사용한다.C++인용 형 변 수 를 함수 형 삼 아 이 부족 함 을 보완 했다.
C++는 함수 에 데 이 터 를 전달 하 는 제(3)방법,즉 변 수 를 전송 하 는 별명 을 제공 합 니 다.
[예]'인용 형 삼'을 이용 하여 두 변수의 값 교환 을 실현 한다.

#include <iostream>
using namespace std;
int main( )
{
  void swap(int &,int &);
  int i=3,j=5;
  swap(i,j);
  cout<<"i="<<i<<" "<<"j="<<j<<endl;
  return 0;
}
void swap(int &a,int &b) //       
{
  int temp;
  temp=a;
  a=b;
  b=temp;
}
출력 결 과 는:

  i=5 j=3
swap 함수 의 형 참 표 열 에서 a 와 b 는 정형 변수의 인용 이 라 고 설명 합 니 다.

실제로 허실 을 결합 할 때 실 삼 i 의 주 소 를 형 삼 a 에 전달 하여 형 삼 a 의 주 소 를 실 삼 i 의 주 소 를 취하 여 a 와 i 가 같은 단원 을 공유 하도록 한다.마찬가지 로 실제 인삼 j 의 주 소 를 형 삼 b 에 전송 하여 형 삼 b 의 주 소 를 실제 인삼 j 의 주 소 를 취하 여 b 와 j 가 같은 단원 을 공유 하도록 한다.이것 이 바로 주소 전달 방식 이다.이해 하기 편리 하도록 변수 i 의 이름 을 인용 변수 a 에 전달 하여 a 를 i 의 별명 으로 만 들 수 있다.
이런 전달 방식 과 지침 변 수 를 형 삼 으로 사용 할 때 어떤 차이 가 있 는 지 생각해 보 세 요.인용 형식 을 사용 하면 swap 함수 에서 형 삼 이 포인터 변수 라 고 설명 할 필요 가 없습니다.포인터 변 수 는 메모리 셀 을 따로 열 어야 합 니 다.그 내용 은 주소 입 니 다.한편,인용 변 수 는 독립 된 변수 가 아니 라 메모리 셀 을 단독으로 차지 하지 않 습 니 다.예 를 들 어 변수 a 와 b 의 값 을 참조 하 는 데이터 형식 은 실제 인삼 과 같 고 모두 정형 입 니 다.
main 함수 에서 swap 함 수 를 호출 할 때 실제 참 조 는 변수의 주소(변수 이름 앞 에&)를 사용 하지 않 고 변수 이름 을 직접 사용 합 니 다.시스템 이 형 삼 에 전송 하 는 것 은 실 삼 의 주소 이지 실 삼 의 값 이 아니다.
이러한 전달 방식 은 Pascal 언어 중의'변수 형 삼'에 해당 하 는데 이런 용법 은 포인터 변 수 를 사용 하 는 것 보다 간단 하고 직관 적 이 며 편리 합 니 다.변수의 인용 을 사용 하면 포인터 의 동작 을 일부 대체 할 수 있 습 니 다.과거 에는 포인터 로 만 처리 할 수 있 었 던 문제 들 이 있 었 는데,이 제 는 인용 으로 대체 할 수 있어 프로그램 설계 의 난이 도 를 낮 출 수 있다.
[예]세 개의 변 수 를 작은 것 에서 큰 것 으로 정렬 합 니 다.

#include <iostream>
using namespace std;
int main( )
{
  void sort(int &,int &,int &); //    ,       
  int a,b,c; //a,b,c       
  int a1,b1,c1; //a1,b1,c1            
  cout<<"Please enter 3 integers:";
  cin>>a>>b>>c; //  a,b,c
  a1=a;b1=b;c1=c;            
  sort(a1,b1,c1); //  sort  , a1,b1,c1   
  cout<<"sorted order is "<<a1<<" "<<b1<<" "<<c1<<endl; //  a1,b1,c1    
  return 0;
}
void sort(int &i,int &j,int &k) // i,j,k 3    
{
  void change(int &,int &); //    ,       
  if (i>j) change (i,j); // i<=j
  if (i>k) change (i,k); // i<=k
  if (j>k) change (j,k); // j<=k
}
void change (int &x,int &y) // x y  
{
  int temp;
  temp=x;
  x=y;
  y=temp;
}
운행 상황 은 다음 과 같다.

Please enter 3 integers:23 12 -345L
sorted order is -345 12 23
이 프로그램 은 이해 하기 쉽 고 실수 하기 쉽 지 않다.sort 함 수 를 호출 할 때 허실 결합 을 통 해 형 삼 i,j,k 를 실 삼 a1,b1,c1 의 인용 으로 만 들 었 기 때문에 호출 함수 sort(a1,b1,c1)를 통 해 i,j,k 정렬 을 실 현 했 을 뿐만 아니 라 a1,b1,c1 정렬 도 동시에 실현 했다.마찬가지 로 change(i,j)함 수 를 실행 하면 실제 인삼 i 와 j 의 교환 을 실현 할 수 있 습 니 다.
인용 은 변수 뿐만 아니 라 대상 에 도 사용 할 수 있다.예 를 들 어 실 삼 은 하나의 대상 명 으로 허실 이 결 합 될 때 전달 대상 의 시작 주소 일 수 있다.나중에 소개 할 게 요.
&a 와 같은 형식 을 보 았 을 때 인용 변 수 를 설명 하 는 것 입 니까?주 소 를 찾 는 것 입 니까?&a 의 앞 에 유형 문자 가 있 을 때(예 를 들 어 int&a)인용 에 대한 성명 일 것 입 니 다.앞 에 형식 문자(예 를 들 어 cout<&a)가 없 으 면 변 수 를 가 져 오 는 주소 입 니 다.

좋은 웹페이지 즐겨찾기