簡體   English   中英

如何將int *轉換為int(* p)(void)?

[英]How do I convert int* to int (*p)(void)?

我試着這樣做:

int (*p)(void);
int *i;
...
p = (int *(void))i;

但它導致語法錯誤:

error: cast specifies function type

這有什么不對?

在這種情況下你應該尊重錯誤。 您不能將指向函數的指針轉換為int指針或其他方式。 這可能會導致未定義的行為。

如果你堅持的話,語法應該是:

p = (int (*)(void))i;

我是一個指向整數的指針,p是一個函數指針返回和int並且不帶參數。 它們不以任何方式,形狀或形式兼容/澆鑄。

編譯器說的是什么。 int (*p)(void)是一個函數指針聲明(指向返回int的函數的指針)。 int *i; 是一個標量指針聲明(指向int的指針)。 你不能把一個投入另一個。

如果你必須這樣做(我不會說你應該這樣做)那么:

typedef int (*fp)(void);
int *i;
fp p;
...
p = (fp)((void*)i);

p = (int (*)(void))i;

這是一個例子:

#include <stdio.h>

int f(){
    printf("test\n");
    return 0;
}

int main()
{
    int (*p)(void);
    int *i;

    i = (int*)f;

    p = (int (*)(void))i;

    printf("i=%p\n", i);
    printf("p=%p\n", p);

    ((int (*)(void))i)(); //here, it will call f()

    return 0;
}

*i指向一個簡單的整數,而*p是指向函數的指針,沒有參數返回整數。 因此,這兩個類型完全不同,因為你說p應該指向一個返回int的函數,你不能告訴它指向一個int。

但是,您可以嘗試將兩者都包裝在一個聯合中,如下所示:

union u {
  int *i;
  int (*p)(void);
};

int f(void){
  return 5;
}

int main(int argc, char *argv[]) {
  union u myU;
  int a=6;
  myU.i=&a;
  myU.p=&f;
  return 0;
}

請注意,在分配&f ,您只需調用myU.p() 但是如果省略&f的賦值並在之后調用myU.p() ,則會導致未定義的行為(即程序崩潰)。

你沒有。 也就是說,除非你比編譯器更了解存儲在int *中的指針首先來自int (*p)(void) 正如其他人所說,第二種類型是一個指向函數的指針,該函數不帶參數並返回一個int。 第一種類型是指向整數的簡單指針(如果被視為數組,則為多於一個整數)。

暫無
暫無

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

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