簡體   English   中英

將參數傳遞給函數指針數組

[英]Passing argument to array of function pointers

我正在用C編寫一個使用函數指針數組的程序。 如果不包含參數,則可以使用代碼調用函數而不會出現問題。

int (*functionsArray[2][3])() = {
  {functionOne,functionTwo,functionThree},
  {functionFour,functionFive,functionSix}
};

但是,當我嘗試傳遞參數int x

int (*functionsArray[2][3])(int x) = {
  {functionOne,functionTwo,functionThree},
  {functionFour,functionFive,functionSix}
};

我收到一個錯誤:

invalid conversion from 'int (*)()' to 'int (*)(int)'

同樣,這些函數都不返回int,我不應該將它們聲明為void嗎?

void(*functionsArray[2][3])(int x) = {
  {functionOne,functionTwo,functionThree},
  {functionFour,functionFive,functionSix}
};

嘗試此操作將導致錯誤:

 error: invalid conversion from 'int (*)()' to 'void (*)(int)'

謝謝。

只要您正確聲明函數,該方法就可以正常工作:

#include <stdio.h>

int functionOne(int x)   { return 1; }
int functionTwo(int x)   { return 2; }
int functionThree(int x) { return 3; }
int functionFour(int x)  { return 4; }
int functionFive(int x)  { return 5; }
int functionSix(int x)   { return 6; }

int (*functionsArray[2][3])(int x) = {
    {functionOne,  functionTwo,  functionThree},
    {functionFour, functionFive, functionSix}
};

int main (void) {
    printf ("%d\n", (functionsArray[0][1])(99));
    printf ("%d\n", (functionsArray[1][2])(99));
    return 0;
}

該程序的輸出為26


如果您不希望返回任何值,它也將起作用:

#include <stdio.h>

void functionOne(int x)   { puts ("1"); }
void functionTwo(int x)   { puts ("2"); }
void functionThree(int x) { puts ("3"); }
void functionFour(int x)  { puts ("4"); }
void functionFive(int x)  { puts ("5"); }
void functionSix(int x)   { puts ("6"); }

void (*functionsArray[2][3])(int x) = {
    {functionOne,  functionTwo,  functionThree},
    {functionFour, functionFive, functionSix}
};

int main (void) {
    (functionsArray[0][1])(99);
    (functionsArray[1][2])(99);
    return 0;
}

該程序還會輸出26 ,這與預期的一樣。


歸結為確保函數聲明與數組中給定的類型匹配。

聲明數組時:

int (*functionsArray[2][3])(int x) = 
{
   {functionOne,functionTwo,functionThree},
   {functionFour,functionFive,functionSix}
};

數組的每個元素都必須為int (*)(int) 否則,編譯器會正確報告錯誤。

舉一個簡單的例子:

void foo()
{
}

int (*fp)(int x) = foo;

應該會導致相同的編譯器錯誤,因為您嘗試使用foo初始化類型為int (*)(int)的變量,其類型為void (*)()

暫無
暫無

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

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