C ++는 언제 참조와 포인터를 사용합니까?

1. 매개 변수 전달 방법 : 값 전달 및 주소 전달

(1) 값 전달 방법은 실제 매개 변수 값의 복사본을 함수 (메소드)에 전달하고 해당 메서드에서 형식 매개 변수를 연산하는 것입니다. 객체는 실제 매개 변수의 복사본이므로 영향을 줄 수 없습니다. 메소드가 반환 한 후, 형식 매개 변수가 해제되고 삭제되며 실제 매개 변수의 내용은 변경되지 않습니다.

(2) 어드레싱 모드에 의해 실제 매개 변수의 주소가 함수 (메소드)로 전달됩니다. 메소드에서 형식 매개 변수를 조작하는 것은 실제 매개 변수에 대해 동일한 연산을 수행하는 것과 동일합니다. 메서드가 종료되고 반환 된 후 형식은 매개 변수도 해제됩니다. 매개 변수의 내용은 형식 매개 변수에 대한 작업의 결과가됩니다.

주소 전달 방법은 다음과 같이 세분화 될 수 있습니다. 참조에 의한 전달, 포인터에 의한
참조 참조는 실제로 객체 의 별칭 , 객체의 참조를 전달, 객체의 주소를 매개 변수로 사용하는 데 사용됩니다. , 객체 자체가 아니라 . 이것이 우리가 이해하는 이전 질문에 대한 답입니다. 참조로 전달하면 실제 매개 변수를 형식 매개 변수에 복사하지 않고 효율성이 향상됩니다.

2. 참조 매개 변수를 사용하는 경우

(1) 참조 매개 변수를 사용하는 주된 이유는
프로그래머가 호출 함수에서 데이터 개체를 수정할 수
있으며 전체 데이터 개체 대신 참조를 전달함으로써 실행 속도를 향상시킬 수 있다는 것입니다.

(2) 변경하지 않고 함수에 전달 된 값 사용 : 내장 데이터 객체와 같이 데이터 객체가 작 으면
데이터 객체가 배열 인 경우 프레스 패스 값 , 포인터 및 포인터가 다음과 같이 선언됩니다. CONST 포인터
데이터 객체가 큰 구조를 사용 CONST 포인터 나 const를 참조 효율성을 개선하고 시간과 공간을 절약 할 수있는 구조를 복사하는 데 필요한 경우. 만약
데이터 객체가 클래스 객체를 사용 const를 참조하는 경우. 클래스 디자인의 의미는 종종 참조를 사용해야하는 경우가 있는데, 이것이 C ++에서이 기능을 추가 한 주된 이유이므로 클래스 객체를 전달하는 표준 방법은 참조로 전달하는 것입니다.

(3) 호출 함수의 데이터를 수정하는 함수의
경우 : 데이터 개체가 내장 데이터 유형이면 포인터를 사용합니다.
데이터 객체가 배열이면 포인터 만 사용할 수 있습니다.
데이터 객체가 구조이면 참조 또는 포인터를 사용
하고 데이터 객체가 클래스 객체이면 참조를 사용합니다.

3. 결론

C / C ++ 프로그래밍에서 언제 포인터를 사용하여 매개 변수를 전달해야합니까? 다음과 같이 요약됩니다.

  1. 실제 매개 변수를 변경해야하는 경우 포인터 만 사용할 수 있습니다.
  2. 큰 구조와 "읽기 전용"요소를 전달할 때

큰 구조는 값으로 전달되기 때문에 각 요소를 복사해야하므로 비효율적입니다.

  1. 배열을 순회하거나 해당 요소를 자주 참조해야하는 경우 첨자를 사용하는 것보다 더 효율적입니다.

  2. 공간을 동적으로 할당 할 때 포인터를 사용해야합니다.

  3. 배열을 전달할 때 포인터를 사용해야합니다.

  4. 함수가 fopen과 같은 포인터를 반환 할 때

  5. 또한 보조 포인터, 즉 포인터에 대한 포인터를 사용해야하는 경우가 있습니다. 예를 들면 다음과 같습니다.
    MemAllocate (char * a) { a = (char *) malloc (sizeof (char));

}

이 함수가 메모리 할당을 위해 호출되면, 현재 a의 경우 형식 매개 변수가 변경되었지만 실제 매개 변수는 변경되지 않기 때문에 메모리를 성공적으로 할당 할 수 없음을 발견합니다. 이들은 다른 메모리 단위에 해당합니다. 올바른 글은 다음과 같아야합니다.

MemAllocate(char **a){

*a=(char *)malloc(sizeof(char));

}

이러한 방식으로 메모리를 올바르게 할당 할 수 있습니다.

대부분의 경우 포인터와 참조는 동일한 효과를 갖지만 참조는 형식 매개 변수와 동일한 방식으로 사용되지만 포인터의 특성을 가지고 있기 때문에 읽기에 어려움을 겪는 경우가 많습니다. 또한
데이터 개체가 클래스 개체이면 const 참조가 사용됩니다. 클래스 디자인의 의미는 종종 참조를 사용해야하는 경우가 있는데, 이것이 C ++의 새로운 기능의 주된 이유이므로 const 객체를 전달하는 표준 방법은
참조로 전달 하는 것입니다. 다른 때는 포인터를 사용하는 것이 더 좋습니다.

4. 기타

첫째, null 값에 대한 참조는 어떤 상황에서도 사용할 수 없습니다. 참조는 항상 어떤 객체를 가리켜 야합니다.

1. 변수를 사용하고 객체를 가리 키도록하지만 변수가 어떤 지점에서 어떤 객체도 가리 키지 않을 수 있다면 변수를 포인터로 선언해야합니다.

2. 예를 들어, 변수가 개체를 가리켜 야하는 경우, 디자인에서 변수가 비어있는 것을 허용하지 않는 경우 변수를 참조로 선언 할 수 있습니다.

3. null 값에 대한 참조가 없다는 사실은 참조를 사용하는 코드가 포인터를 사용하는 것보다 더 효율적임을 의미합니다. 참조를 사용하기 전에 적법성을 테스트 할 필요가 없기 때문입니다. 참조
규칙은 다음과 같습니다.
(1) 참조는 생성 될 때 초기화되어야합니다 (포인터는 언제든지 초기화 될 수 있음).
(2) NULL 참조가있을 수 없으며 참조는 유효한 저장 단위와 연결되어야합니다 (포인터는 NULL 일 수 있음).
(3) 참조가 초기화되면 참조의 관계를 변경할 수 없습니다 (포인터는 언제든지 가리키는 객체를 변경할 수 있습니다).

참조 :
https://www.cnblogs.com/jingzhishen/p/5046631.html

추천

출처blog.csdn.net/weixin_40437821/article/details/110870552