C ++ 참조에 의해 전달 된 값 사이트 전송, 전달

자세한 개념

1. 송신 값 :

  매개 변수는 인수의 복사본입니다, 변화 매개 변수 값은 외부 인수의 값에 영향을주지 않습니다.

  (인자 -> 변수) 호출 된 함수의 편도 전송의 값의 관점에서, 상기 파라미터의 값만을 수신, 발신하지;

  필요 내부 함수 매개 변수를 수정하고, 발신자 값 전송에 대한 바람직하지 못한 효과가 변화하는 경우.

2. 포인터가 전달된다

  작업이 인수 자체의 작동에 해당하는 경우 매개 변수 인수는 매개 변수의 주소 포인터를 가리키는 포인터이다

3. 참조로 전달

  매개 변수는 "별명", 매개 변수의 동작이 실제로 인수에 작동의 인수와 동등합니다.

  트랜스퍼 프로세스를 참조하여, 그 다음 상기 스택 메모리 영역에 오픈 로컬 변수의 형태 파라미터뿐만 아니라 전달 함수는 호출 함수 인수 변수의 어드레스에 저장된다.

  변조 함수의 모든 동작 매개 변수, 즉 간접 액세스를 스택에 저장되어있는 변수의 주소로 호출하는 함수의 인수를 어드레스로 취급된다.

  이 때문에, 어떤 동작은 호출 함수에 좌우되는 파라미터 조정 함수 인수 변수에 만들어진다.

셋째, 비교 및 ​​포인터 참조

1. 유사성

  주소의 개념은;

  메모리에 대한 포인터, 그것은 메모리 어드레스의 내용이라고한다;

  이는 메모리 별명의 참조 블록이다.

2. 다른 점

  포인터 엔티티이며, 유일한 참조 별칭;

  참고 동안 초기화가 정의 된 경우에만 한 번, 다음 불변, 언제든지 포인터 변수;

  CONST : 참고 만 CONST INT & A (기준값 지점을 변경할 수 없다) 아니오 INT 및 CONST들 a (즉, 별명 물론,이 폼이 필요하지된다 불변 기준 자체) 포인터 모두;

  널 참조가 비어있을 수 없습니다, 포인터;

  오히려 참조 포인터보다 안전한 형태이다 (기타 포인터 타입 검사보다는 참조)

  얻어진 변수 뾰족한 (오브젝트)의 사이즈를 sizeof 포인터 및 포인터 크기를 sizeof 기준 자체이며

넷째, 응용 프로그램

참조 자연 포인터 통과로 전달하지만, 값이 기록으로 전송된다.

값은 전달됩니다

FUNC1 공극 (INT의 X)

{

  X = X + 1;

}

포인터를 전달 :

보이드 FUNC1 INT (X *)

{

  * X * X = 1;

}

참조로 전달 :

FUNC1 공극 (INT 및 X)

{

  X = X + 1;

}

사실은 "참조"당신은 왜해야 "참조"할 수있다 "포인터"아무것도 할 수 있지만에서?

->指针太灵活,可以毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险;

如果的确只需要借用下 某个 对象的 别名, 那么就用引用,以免发生意外。

 

以下代码很好的说明了问题

 1 #include<iostream>
 2  
 3 using namespace std;
 4  
 5 //值传递
 6  void change1(int n){
 7     cout<<"值传递--函数操作地址"<<&n<<endl;         //显示的是拷贝的地>   址而不是源地址 
 8     n++;
 9 }
10                                                                        
11 //引用传递
12 void change2(int & n){
13     cout<<"引用传递--函数操作地址"<<&n<<endl;
14     n++;
15 }
16  //指针传递
17 void change3(int *n){
18      cout<<"指针传递--函数操作地址 "<<n<<endl;
19     *n=*n+1;
20  }      
21 int     main(){
22     int n=10;
23     cout<<"实参的地址"<<&n<<endl;
24     change1(n);
25     cout<<"after change1() n="<<n<<endl;
26     change2(n);
27     cout<<"after change2() n="<<n<<endl;
28     change3(&n);
29     cout<<"after change3() n="<<n<<endl;
30     return true;
31 }

结果如下

qqtsj@qqtsj-Nitro-AN515-51:~/cpp$ g++ -o tate1 tate1.cpp
qqtsj@qqtsj-Nitro-AN515-51:~/cpp$ ./tate1
实参的地址0x7ffd1ee21884
值传递--函数操作地址0x7ffd1ee2186c
after change1() n=10
引用传递--函数操作地址0x7ffd1ee21884
after change2() n=11
指针传递--函数操作地址 0x7ffd1ee21884
after change3() n=12

 

추천

출처www.cnblogs.com/tanshengjiang/p/11831760.html