참조 매개 변수가있는 함수에 대한 포인터 전달

Zazke

일반적으로 이것은 컴파일러에 의해 포착됩니다. 그러나 함수 포인터에 대한 캐스트를 사용하면이를 수행 할 수 있습니다.

내가 제대로 말하지 않았을 수 있습니다. 여기 내 질문을 더 잘 설명하는 예가 있습니다.

void printintp(int *ip)
{
    printf("pointer = %p\n", ip);
    printf("*pointer = %d\n", *ip);
}

void printint(int &i)
{
    printf("int = %d\n", i);
}

int main()
{
    int a = 555;
    //int &irp = &a;   // ERROR 1
    void (*f)(void *);

    //printint((int &) &a);   // ERROR 2
    f = (void (*)(void *))printintp;
    f(&a);
    f = (void (*)(void *))printint;
    //printint(&a);       // ERROR 3 (invalid conversion of `int *` to `int`)
    f(&a);              // GOOD (why?)
    return 0;
}

그리고 출력은 당연히 예상되는 것입니다.

pointer = 0x7ffd01995bf4
*pointer = 555
int = 555

그래서 내 질문은 이것으로 구체화됩니다. 왜 &a객체 기대 함수에 포인터 전달하는 것이 printint괜찮습니까? 내 구현에서 작동하는 정의되지 않은 동작입니까? 그렇지 않은 경우 주소를 전달하면 매개 변수 int &i가 객체에 어떻게 바인딩되고 a내가 표시 한 것을 거부하는 이유는 무엇 ERROR 2입니까?

PS : 나는이 문제에 대해 찾을 수있는 최선은 둘을 주장하는 printintp그리고 printint실제로, 함수 호출이 다른 (수 있습니다,하지만, "기능적으로 동일"입니다 printintp(&a)printint(a)).

PS2 : 포인터와 참조의 차이를 묻지 않습니다 . 이미 여기에 설명되어 있습니다 .

레미 르보

내 구현에서 작동하는 정의되지 않은 동작입니까?

예. 대부분의 컴파일러는 내부적으로 포인터를 사용하여 참조를 구현하지만 표준에 의해 지시되지는 않습니다.

표준 구문에서는 포인터를있는 그대로 참조에 할당 할 수 없으며 그 반대의 경우도 마찬가지이므로 해당 명령문에서 컴파일러 오류가 발생합니다.

모든 것을에 캐스팅 void*하면 모든 베팅이 유형 안전에 대해 해제됩니다. 사용하여 C 스타일의 유형 캐스트를 , 당신은 단지에 대해 아무것도 멀리 얻을 수 있습니다. 당신은 기본적으로 당신이하고있는 일을 알고 있다는 것을 컴파일러에게 말하고 있기 때문에 그것을 받아들이고 조용해야합니다. 이 때 같은 유형 캐스트가 위험 할 수 있습니다 이유입니다 하지 않습니다 당신이 정말로 무엇을하고 있는지 알고 절대적으로 필요한 경우가 아니면 피해야한다. 당신이 캐스팅해야하는 경우, C ++를 선호 - 스타일 타입 캐스트를 대신 ( static_cast, reinterpret_cast, 등). 적어도 형식 안전성을 포기하지는 않을 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

벡터에 대한 참조를 매개 변수로 전달

분류에서Dev

함수에 대한 참조로 포인터 전달

분류에서Dev

포인터 / 참조를 변수로 매개 변수로 전달

분류에서Dev

C 매개 변수에 대한 참조 전달

분류에서Dev

한 C 함수에 대한 포인터를 다른 함수에 대한 매개 변수로 전달

분류에서Dev

어셈블리는 매개 변수 전달을 어떻게 수행합니까? 값, 참조, 다른 유형 / 배열에 대한 포인터로?

분류에서Dev

포인터에 대한 참조 전달

분류에서Dev

포인터에 대한 참조 전달

분류에서Dev

포인터에 대한 참조 전달

분류에서Dev

벡터의 요소에 대한 가변 참조를 해당 벡터와 함께 함수의 매개 변수로 전달합니다.

분류에서Dev

포인터 매개 변수에 대한 포인터가있는 PInvoke 함수

분류에서Dev

함수를 참조하여 포인터 매개 변수를 전달한다는 것은 무엇을 의미합니까?

분류에서Dev

SFINAE를 사용하여 함수 템플릿의 매개 변수로 구조체에 대한 참조 전달

분류에서Dev

함수에 대한 포인터 전달

분류에서Dev

재귀 함수에 대한 참조로 벡터 전달

분류에서Dev

함수에 대한 포인터에 대한 포인터 전달

분류에서Dev

함수의 매개 변수로 전달 된 배열에 대한 포인터 사용

분류에서Dev

참조를받는 함수에 대한 포인터를 전달 하시겠습니까?

분류에서Dev

포인터를 기대하는 함수에 역 참조 된 포인터 (즉, 값으로) 전달

분류에서Dev

함수에 대한 참조로 전달 된 이중 포인터 2d 배열에 액세스

분류에서Dev

지시문에 대한 동적 매개 변수가있는 AngularJS 전달 함수

분류에서Dev

함수 매개 변수 대 함수 매개 변수에 대한 포인터?

분류에서Dev

함수에서 참조로 const 포인터를 const에 전달

분류에서Dev

조인에 매개 변수 전달

분류에서Dev

함수에 대한 포인터를 매개 변수로 사용하는 함수를 전달하는 방법은 무엇입니까?

분류에서Dev

함수 인수에 전달 된 개체 참조

분류에서Dev

구조체 멤버에 대한 포인터를 함수에 전달

분류에서Dev

함수에 전달 된 구조체의 배열에 대한 C 포인터

분류에서Dev

포인터에 대한 상수 참조

Related 관련 기사

  1. 1

    벡터에 대한 참조를 매개 변수로 전달

  2. 2

    함수에 대한 참조로 포인터 전달

  3. 3

    포인터 / 참조를 변수로 매개 변수로 전달

  4. 4

    C 매개 변수에 대한 참조 전달

  5. 5

    한 C 함수에 대한 포인터를 다른 함수에 대한 매개 변수로 전달

  6. 6

    어셈블리는 매개 변수 전달을 어떻게 수행합니까? 값, 참조, 다른 유형 / 배열에 대한 포인터로?

  7. 7

    포인터에 대한 참조 전달

  8. 8

    포인터에 대한 참조 전달

  9. 9

    포인터에 대한 참조 전달

  10. 10

    벡터의 요소에 대한 가변 참조를 해당 벡터와 함께 함수의 매개 변수로 전달합니다.

  11. 11

    포인터 매개 변수에 대한 포인터가있는 PInvoke 함수

  12. 12

    함수를 참조하여 포인터 매개 변수를 전달한다는 것은 무엇을 의미합니까?

  13. 13

    SFINAE를 사용하여 함수 템플릿의 매개 변수로 구조체에 대한 참조 전달

  14. 14

    함수에 대한 포인터 전달

  15. 15

    재귀 함수에 대한 참조로 벡터 전달

  16. 16

    함수에 대한 포인터에 대한 포인터 전달

  17. 17

    함수의 매개 변수로 전달 된 배열에 대한 포인터 사용

  18. 18

    참조를받는 함수에 대한 포인터를 전달 하시겠습니까?

  19. 19

    포인터를 기대하는 함수에 역 참조 된 포인터 (즉, 값으로) 전달

  20. 20

    함수에 대한 참조로 전달 된 이중 포인터 2d 배열에 액세스

  21. 21

    지시문에 대한 동적 매개 변수가있는 AngularJS 전달 함수

  22. 22

    함수 매개 변수 대 함수 매개 변수에 대한 포인터?

  23. 23

    함수에서 참조로 const 포인터를 const에 전달

  24. 24

    조인에 매개 변수 전달

  25. 25

    함수에 대한 포인터를 매개 변수로 사용하는 함수를 전달하는 방법은 무엇입니까?

  26. 26

    함수 인수에 전달 된 개체 참조

  27. 27

    구조체 멤버에 대한 포인터를 함수에 전달

  28. 28

    함수에 전달 된 구조체의 배열에 대한 C 포인터

  29. 29

    포인터에 대한 상수 참조

뜨겁다태그

보관