ProgramingTip

C ++ : 함수 / 메소드 선언에서 앰퍼샌드 "&"와 별표 "*"의 차이점은 무엇입니까?

bestdevel 2020. 11. 15. 11:35
반응형

C ++ : 함수 / 메소드 선언에서 앰퍼샌드 "&"와 별표 "*"의 차이점은 무엇입니까?


그들 사이에 미묘한 차이가?

void a1(float &b) {
    b=1;
};
a1(b);

void a1(float *b) {
    (*b)=1;
};
a1(&b);

?

둘 다 똑같습니다 (또는 main ()에서 보임), 첫 번째는 분명히 더 짧지 만 내가 보는 대부분의 코드는 두 번째 표기법을 사용합니다. 차이가 있습니까? 어쩌면 float 대신에 어떤 경우일까요?


둘 다 동일하지만 하나는 참조를 사용하고 다른 하나는 포인터를 사용합니다.

모든 차이점에 대한 비교 인 목록은 여기 내 대답을 참조하십시오 .


예. *표기는 스택에 통과되는 무슨 의미 포인터, 즉, 뭔가의 주소라고 말했다. &그것이 참조 말한다. 효과는 동일하지만 동일합니다.

두 가지 경우를 살펴 보겠습니다.

   void examP(int* ip);
   void examR(int& i);

   int i;

전화 examP하면 씁니다

   examP(&i);

항목의 주소를 가져와 스택에 전달합니다. 내가 전화 examR하면

   examR(i);

나는 그것을 필요로하지 않는다; 이제 컴파일러는 "어떻게 든"참조를 전달합니다. 이는 사실상 사실상 i. 코드에서

   void examP(int* ip){
        *ip += 1;
   }

포인터를 역 참조해야합니다. ip += 1매우 다른 일을합니다.

   void examR(int& i){
        i += 1;
   }

항상 값을 업데이트합니다 i.

더 자세히 알아 보려면 "참조로 호출"을 읽어와 "값으로 호출"을 읽어보십시오. &개념은 참조로 C ++ 호출을 제공합니다.


참조가있는 첫 번째 예제에서는 bNULL이 될 수 없음 을 알고 있습니다. 포인터 예제에서는 bNULL 포인터가 될 수 있습니다.

그러나 참고가 될 것입니다 참조를 통해 NULL 오브젝트를 통과 할 수 있습니다, 어색하고 오류의 가정 할 수 호출 된 프로 시저가 그렇게 한 내용 :

a1(*(float *)NULL);

두 번째 예에서 호출자 는 변수의 주소를 전달하기 위해 변수 이름 앞에 '&'를 가져야합니다.

이것은 이점이 될 수 있습니다. 호출자는 변수가 값으로 전달되었다고 생각할 때 참조로 전달하여 실수로 변수를 전달할 수 없습니다.


구문 설탕을 제외하고 유일한 실제 차이점은 포인터 인 함수 변수가 널이 될 수있는 것입니다. 따라서 포인터 버전은 null 케이스를 처리하면 더 표현력이 있습니다. null 케이스는 특별한 의미를 가질 수 있습니다. 참조 버전은 null 기능없이 지정된 유형의 값에서만 작동 할 수 있습니다.


귀하의 예에서 기능적으로 두 버전 모두 동일합니다.

첫 번째는 콜 측에서 투명하고 있습니다. 운영자를 어떻게 사용하는지 지 상상해보세요.

cin >> &x;

그리고 스왑 호출에 대한 추악한 모습

swap(&a, &b);

a와 b를 바꾸고 싶습니다. 그리고 처음 주소를 입력해야 할 때보 다 훨씬 좋아 보입니다. 부수적으로, bjarne stroustrup은 참조의 주된 이유는 특히 운영자를 위해 호출 측에 추가 된 투명성 때문이라고 썼습니다. 또한 다음이 더 이상 명확하지 않은지 확인하십시오.

&a + 10

a의 내용에 10을 더하거나, operator +를 호출하거나, a에 대한 임시 포인터에 10을 추가할지 여부. 내장 피연산자 (포인터 및 정수와 같은)에 대해서만 연산자를 오버로드 할 수 없다는 것을 불가능에 추가하십시오. 참고 문헌은 이것을 명확하게 만듭니다.

포인터는 "null"을 입력하려는 경우 유용합니다.

a1(0);

그런 다음 a1에서 메서드는 포인터를 0과 비교하여 포인터가 어떤 개체를 가리키는 지 확인할 수 있습니다.


주목할 가치가있는 한 가지 큰 차이점은 외부에서 일어나는 일입니다.

a1(something);

또는:

a1(&something);

함수 / 메소드에서 수정되지 않은 경우 (항상 const 하나 :)) 인수를 전달하고 (그런 다음 자동 / 임시 객체를 내부로 전달할 수도 있음) 포인터로 전달하여 사용자에게 알리고 경고합니다. 인수가 내부에서 의도적으로 수정 될 수있는 메서드를 호출하는 코드의 리더.

참고 URL : https://stackoverflow.com/questions/596636/c-difference-between-ampersand-and-asterisk-in-function-method-declar

반응형