함수의 함수 포인터 및 주소
때 굳이 포인터는 요.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);
전화 왔습니다.foo
Function 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
'programing' 카테고리의 다른 글
[Vue warn] :알 수 없는 사용자 지정 요소: ..." vuetify UI 구성 요소를 vue-cli-plugin-vuetify와 함께 사용하는 경우 오류 발생 (0) | 2022.08.27 |
---|---|
vue + Typescript 클래스 구성 요소와 mapActions를 사용하는 방법 (0) | 2022.08.27 |
템플릿에서 직접 vuex 상태 사용/수정 (0) | 2022.08.19 |
Link-Time Optimization(LTO; 링크타임 최적화)을 사용하지 않는 이유가 있습니까? (0) | 2022.08.19 |
다른 VUEj 내부에 컨테이너를 렌더링 (0) | 2022.08.19 |