簡體   English   中英

指向c ++函數的指針

[英]A pointer to function in c++

當我用指針指向函數時,我發現了一些東西並且不明白

我這樣做了:

#include <stdio.h>

int callback(void)
{
   return 5;
}

void call(int (*cpmpare)(void))
{
    int x;
    x = cpmpare();
    printf("%d", x);
}

void main()
{
    int (*compare)(void);
    int *a, b;
    b = 5;
    a = &b;
    compare = callback;
    printf("%p\n", &callback);
    printf("%p\n", compare);
    call(&callback);
}

我做了compare = &callback而不是compare = callback ,它做了同樣的事情,比較得到了與回調相同的地址。

為什么兩種方式都有效?

據我所知,比較指針和常規變量將是錯誤的。

函數(如數組)在某些上下文中會衰減為指針。 使用&functionfunction幾乎總是一樣的。 在你的例子中,情況確實如此。 這兩個語句在語義上是相同的:

compare = callback;
compare = &callback;

這兩個是:

call(&callback);
call(callback);

同樣,當您想使用函數指針時, *也是可選的:

x = cpmpare();
x = (*cpmpare)();

C委員會決定(因為含​​義是明確的)函數的名稱(沒有后跟調用該函數的parens)將計算到函數的地址(與數組的名稱求值的方式大致相同)數組開頭的地址)。

官方措辭是(§C99,6.3.2.1/ 4):

函數指示符是具有函數類型的表達式。 除非它是sizeof運算符或一元&運算符的操作數,否則具有類型''函數返回類型''的函數指示符將轉換為具有類型''指向函數返回類型'的指針的表達式。

雖然我不確定Bjarne或C ++委員會對這個想法幾乎是如此興奮,但他們顯然決定同意這一點,所以在C ++中也是如此。 我認為他們對此不感興趣的(主要)原因是,盡管他們可以使用成員函數的名稱進行相同的操作,而該成員函數的名稱后面沒有parens來調用該成員函數,但他們選擇不 - 獲取指向成員函數的指針, 必須使用address-of運算符( & )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM