programing

함수의 함수 포인터 및 주소

yoursource 2022. 8. 19. 22:57
반응형

함수의 함수 포인터 및 주소

때 굳이 포인터는 요.operator &"CHANGE: "CHANGE: "CHANGE: " 。

#include <stdio.h>

double foo (double x){
    return x*x;
}

int main () {

    double (*fun1)(double) = &foo;
    double (*fun2)(double) =  foo;

    printf("%f\n",fun1(10));
    printf("%f\n",fun2(10));

    printf("fun1 = %p \t &foo = %p\n",fun1, &foo);
    printf("fun2 = %p \t  foo = %p\n",fun2,  foo);       

    int a[10];

    printf("  a = %p \n &a = %p  \n",a,&a);

    return 0;
}

출력:

>./a.out 
100.000000
100.000000
fun1 = 0x4004f4      &foo = 0x4004f4
fun2 = 0x4004f4       foo = 0x4004f4
  a = 0x7fff26804470 
 &a = 0x7fff26804470 

걸 요. 즉, '배열,int a[10]a ★★★★★★★★★★★★★★★★★」&a같은 위치를 가리킵니다.레레레 기능 ?능? ????주소는, 보존하고 있는 값(주소)과 같은 주소의 메모리 위치에 보존되어 있습니까?

의 「」int a[10]둘 다, 둘 다a ★★★★★★★★★★★★★★★★★」&a은은주주 르르르르르 르르르르

a은 「」입니다.int[10] 는 타입이 .int*는 배열의 초기 요소를 가리킵니다. &a은 「」입니다.int (*)[10](즉, 10개의 정수 배열에 대한 포인터).배열에는 패딩이 있을 수 없기 때문에 둘 다 같은 을 가진 포인터를 생성하지만 포인터의 유형은 다릅니다.

기능은 어레이와 비슷하지만 완전히 동일하지는 않습니다. ★★foo은 「」입니다.double(double).언제든지foo.& 그 이는 타입은 「이것」, 「이것」, 「이것들은 「이것들」, 「이것들은 「이것들」, 「이것들」입니다.double(*)(double).

따라서 모든 실용적인 목적을 위해 함수의 이름과 동일한 함수에 대한 포인터는 서로 교환할 수 있습니다.몇 가지 미묘함이 있습니다.이 모든 것에 대해 설명하겠습니다.왜 이 모든 이상한 함수 포인터 정의는 모두 기능할까요? 실제로 무슨 일이 일어나고 있는 거죠?" (이 질문은 C++에 대한 질문이었지만 C++의 비멤버 함수에 대한 규칙은 C의 함수와 동일합니다.)

아니요, 기능/어레이를 가리키는 전용 스토리지는 없습니다.

에서는 " " " 가 사용됩니다.variable_name의 주소를 것가 있기 에, 「」를 사용할 .&variable소를얻얻 얻얻얻다다

「」가 됩니다.function_name(괄호 뒤에 괄호가 붙어 있지 않음)은 다른 의미가 없기 때문에 함수의 주소를 가져가는 것으로 해석하는 데 문제가 없었습니다.

마찬가지로 일반 포인터는 명시적으로 참조해야 하지만 함수에 대한 포인터는 참조되지 않으므로(다른 합리적인 해석이 없기 때문에) 다음과 같은 함수에 대한 포인터가 주어집니다.

int (*func)(param_list);

다음은 서로 동등합니다.둘 다 임의의 함수를 호출합니다.func포인트:

(*func)(params);

func(params);

fun그리고.&fun(사이즈 오브(f)가 잘못된 것을 제외하고)는 완전히 동일합니다. a그리고.&a포인터 산술까지 동일합니다.a + 10 == &a + 1,왜냐면10*sizeof(*a) == sizeof(a)(어디서)sizeof(*a) == sizeof(int)).

기본적으로 함수명은 함수로 알려져 있기 때문에 &은 엄밀하게 필요하지 않습니다.이 동작은 어레이에서도 동일합니다.함수 자체는 변수가 아니므로 때로는 예상과 조금 다르게 동작합니다.K&R 제2판이 있는 경우 5.11절에서 함수에 대한 포인터 또는 마지막에 있는 참조 매뉴얼을 참조할 수 있습니다.

섹션 A7.1 포인터 생성:어떤 타입 T에 대해 표현식 또는 서브 표현식의 유형이 "array of T"인 경우 표현식의 값은 배열 내의 첫 번째 객체에 대한 포인터이며 표현식의 유형은 "to T"로 변경됩니다.이 변환은 단항 연산자의 피연산자, ...라는 식을 대신하지 않습니다.마찬가지로 & 연산자의 피연산자로 사용되는 경우를 제외하고 "함수 반환 T" 유형의 식은 "함수 반환 T"로 변환됩니다.

섹션 A7.4.2 주소 오퍼레이터:단항 연산자는 피연산자의 주소를 받습니다.결과는 lvalue에 의해 참조되는 객체 또는 함수에 대한 포인터입니다.오퍼랜드의 유형이 T인 경우 결과 유형은 "T에 포인터"가 됩니다.

제가 알기로는 C99도 마찬가지입니다.

printfrackfun1 = %p \t & foo = %p\n", fun1, foo);

전화 왔습니다.fooFunction Pointer를 전달하여pass by value그리고.

printfrackfun2 = %p \t foo = %p\n", fun2, &foo)

지금 전화하고 있습니다.&foo함수 Pointer를 전달하여pass by reference

어느 경우든, 당신이 전화하고 있는 것은printf기능 포인터만 사용할 수 있습니다.

기억하세요.foo그 자체가function pointer value변수가 아닙니다.

어레이에서도 같은 현상이 발생합니다. int arr[10]10개의 정수의 연속 블록을 가져오고 첫 번째 요소의 주소가 arr에 저장되므로 arr도 포인터입니다.

언급URL : https://stackoverflow.com/questions/9552663/function-pointers-and-address-of-a-function

반응형