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 ++ 호출을 제공합니다.
참조가있는 첫 번째 예제에서는 b
NULL이 될 수 없음 을 알고 있습니다. 포인터 예제에서는 b
NULL 포인터가 될 수 있습니다.
그러나 참고가 될 것입니다 참조를 통해 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 하나 :)) 인수를 전달하고 (그런 다음 자동 / 임시 객체를 내부로 전달할 수도 있음) 포인터로 전달하여 사용자에게 알리고 경고합니다. 인수가 내부에서 의도적으로 수정 될 수있는 메서드를 호출하는 코드의 리더.
'ProgramingTip' 카테고리의 다른 글
iOS 8에서 작동하지 않는 Segue 해제 (0) | 2020.11.15 |
---|---|
reCAPTCHA CAPTCHA가 점점 어려워 지나요 아니면 나만 (0) | 2020.11.15 |
배포를 처리하기 위해 pip, virtualenv 및 Fabric을 어떻게 사용합니까? (0) | 2020.11.15 |
Django에서 'max_length'의 최대 크기는 얼마입니까? (0) | 2020.11.15 |
하나의 함수 호출로 R data.table에 여러 열을 추가 하시겠습니까? (0) | 2020.11.15 |