C 中指標函式一定要有返回型別嗎

時間 2022-05-24 21:10:03

1樓:匿名使用者

不是指標函式一定要返回型別,而是,一個函式,只要你指定了它有返回型別,那你一定要返回一個符合要求的值,哪怕這個值你根本不需要,這就是規定。

既然你規定了v()這個函式,要返回一個void型別的指標,那你必須加上

return 語句。

不過像你這麼寫,其實沒必要。你本來的想法是,定義一個函式,再定義一個指標,然後用這個指標指向這個函式並呼叫它。(我猜的)

但是你現在的**的意思不是這樣的,p=v();這句話是說,執行v()這個函式,並把返回值付給p指標。現在程式的錯誤在編譯階段,所以你還沒法看到結果,就算你在v()加上一個返回值,程式可以執行了,你看到結果就是輸出了你要的那句話,但其實內在的邏輯是錯的。(或者還是不能執行,會在*p的地方報錯)

首先,把v()改成:void v(),不需要返回值。

然後,再讓指標p指向v(),語句應該是p=&v();

(我記不清了,很久不寫c的指標了,但估計你的書上應該有的。)

最後用p指標呼叫這個函式。

2樓:匿名使用者

函式指標函式指標 先有函式再有指標 起碼要求函式型別和函式指標型別一致

void *v()

這裡你定義了一個 返回值為void*的函式然後要再定義一個指向該函式的指標

void* (*p)() = v;

3樓:只揉小飯勺

其實是你對函式理解得還不夠深刻。。。

函式的申明應該放在main函式之前。。。

呼叫的時候是直接函式名+引數,而且你這個地方指標函式也沒用對。。。

再看看書吧。。。

4樓:

只有void型別的函式才不用返回值,而你的程式裡的主函式main裡頭應該要返回一個值,最後一行加上return 0;

5樓:華師來的

主要是 void *v()這個函式中沒有return語句~那你這個函式返回的是什麼~

c++ 中函式返回值如果跟類相關的話,一般是直接返回類還是返回類的指標?

6樓:匿名使用者

返回類的指標會有生命期的問題。我認為常見情況是直接返回物件

請教c++中函式型指標和指標型函式的用法和區別,謝謝

7樓:匿名使用者

1 函式指標變數

在c語言中,一個函式總是佔用一段連續的記憶體區,而函式名就是該函式所佔記憶體區的首地址。我們可以把函式的這個首地址(或稱入口地址)賦予一個指標變數,使該指標變數指向該函式。然後通過指標變數就可以找到並呼叫這個函式。

我們把這種指向函式的指標變數稱為「函式指標變數」。

函式指標變數定義的一般形式為:

型別說明符 (*指標變數名)();

其中「型別說明符」表示被指函式的返回值的型別。「(* 指標變數名)」表示「*」後面的變數是定義的指標變數。最後的空括號表示指標變數所指的是一個函式。

例如:int (*pf)();

表示pf是一個指向函式入口的指標變數,該函式的返回值(函式值)是整型。

【例】本例用來說明用指標形式實現對函式呼叫的方法。

int max(int a,int b)

main()

從上述程式可以看出用,函式指標變數形式呼叫函式的步驟如下:

1) 先定義函式指標變數,如後一程式中第9行 int (*pmax)();定義 pmax為函式指標變數。

2) 把被調函式的入口地址(函式名)賦予該函式指標變數,如程式中第11行 pmax=max;

3) 用函式指標變數形式呼叫函式,如程式第14行 z=(*pmax)(x,y);

4) 呼叫函式的一般形式為:

(*指標變數名) (實參表)

使用函式指標變數還應注意以下兩點:

a) 函式指標變數不能進行算術運算,這是與陣列指標變數不同的。陣列指標變數加減一個整數可使指標移動指向後面或前面的陣列元素,而函式指標的移動是毫無意義的。

b) 函式呼叫中"(*指標變數名)"的兩邊的括號不可少,其中的*不應該理解為求值運算,在此處它只是一種表示符號。

2 指標型函式

前面我們介紹過,所謂函式型別是指函式返回值的型別。在c語言中允許一個函式的返回值是一個指標(即地址),這種返回指標值的函式稱為指標型函式。

定義指標型函式的一般形式為:

型別說明符 *函式名(形參表)

其中函式名之前加了「*」號表明這是一個指標型函式,即返回值是一個指標。型別說明符表示了返回的指標值所指向的資料型別。

如:int *ap(int x,int y)

表示ap是一個返回指標值的指標型函式,它返回的指標指向一個整型變數。

【例】本程式是通過指標函式,輸入一個1~7之間的整數,輸出對應的星期名。

main()

char *day_name(int n);

return((n<1||n>7) ? name[0] : name[n]);

}本例中定義了一個指標型函式day_name,它的返回值指向一個字串。該函式中定義了一個靜態指標陣列name。name陣列初始化賦值為八個字串,分別表示各個星期名及出錯提示。

形參n表示與星期名所對應的整數。在主函式中,把輸入的整數i作為實參,在printf語句中呼叫day_name函式並把i值傳送給形參n。day_name函式中的return語句包含一個條件表示式,n值若大於7或小於1則把name[0]指標返回主函式輸出出錯提示字串「illegal day」。

否則返回主函式輸出對應的星期名。主函式中的第7行是個條件語句,其語義是,如輸入為負數(i<0)則中止程式執行退出程式。exit是一個庫函式,exit(1)表示發生錯誤後退出程式,exit(0)表示正常退出。

應該特別注意的是函式指標變數和指標型函式這兩者在寫法和意義上的區別。如int(*p)()和int *p()是兩個完全不同的量。

int (*p)()是一個變數說明,說明p是一個指向函式入口的指標變數,該函式的返回值是整型量,(*p)的兩邊的括號不能少。

int *p()則不是變數說明而是函式說明,說明p是一個指標型函式,其返回值是一個指向整型量的指標,*p兩邊沒有括號。作為函式說明,在括號內最好寫入形式引數,這樣便於與變數說明區別。

對於指標型函式定義,int *p()只是函式頭部分,一般還應該有函式體部分。

8樓:椴

函式指標:是指向函式的指標變數,在c編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。

函式指標的用途是很大的,主要有兩個作用:用作呼叫函式和做函式的引數。

函式指標的宣告方法:

資料型別標誌符 (指標變數名) (形參列表);

一般函式的宣告為:

int func ( int x );

而一個函式指標的宣告方法為:

int (*func) (int x);

前面的那個(*func)中括號是必要的,這會告訴編譯器我們宣告的是函式指標而不是宣告一個具有返回型為指標的函式,後面的形參要視這個函式指標所指向的函式形參而定。

然而這樣宣告我們有時覺得非常繁瑣,於是typedef可以派上用場了,我們也可以這樣宣告:

typedef int (*pf) (int x);

pf pf;

這樣pf便是一個函式指標,方便了許多。當要使用函式指標來呼叫函式時,func(x)或者 (*fucn)(x) 就可以了,當然,函式指標也可以指向被過載的函式,編譯器會為我們區分這些過載的函式從而使函式指標指向正確的函式。

例子:複製**

typedef void (*pft) ( char ,int );

void bar(char ch, int i)

pft pft;

pft = bar;

pft('e',91);

複製**

typedef void (*pft) ( char ,int );

void bar(char ch, int i)

void foo(char ch, int i, pft pf)

pft pft;

pft = bar;

foo('e',12,pft);

複製**

上述例子我們首先利用一個函式指標pft指向bar(),然後在foo()函式中使用pft指標來呼叫bar(),實現目的。將這個特點稍加利用,我們就可以構造出強大的程式,只需要同樣的foo函式便可以實現對不同bar函式的呼叫。

9樓:匿名使用者

函式型指標,也即指標指向的是一種函式型別,首先指向的是函式,並且這個函式有型別(形參,返回值)

如:int (* pmax)(int a,int b);

指標 pmax 即是一個函式型指標,這個函式的型別是,返回值為int,並帶有兩個int 型的形參

指標型函式,也即返回型別為指標的函式

如:char * mystrcat(char * p1,const char *2);

char *s1 = "jaycnvip";

char *purl = mystrcat(s1,".com");

指標 purl 即儲存了函式 mystrcat 返回的字元指標

10樓:

簡單的就是一個用指標去儲存函式是函式型指標而函式&形參為指標的是指標型函式

像函式型指標 :int (*s); //用它去指向一個返回為int函式 ,像int u(int s){}

然後把函式地址給*s,*s=u;

最後可以用s(5)就可以等於u(5);

而指標型函式,像void *s(char *s){}就是了 。。。

11樓:year醫海無邊

c#中採用委託的方式,其實和c++的typedef非常相像,都是必須先定義一個型別,然後用該型別去宣告一個變數。最大的不同在賦值階段,c++只需要簡單的將函式地址賦給指標,而c#必須用new宣告一個物件,並且還要求相應的函式作為形參傳入。在這個階段,似乎c#顯得更為複雜。

到了呼叫階段,c++和c#都可以容器後加個括號就能完成呼叫,但c++還多了一種*的方式。

12樓:

函式型指標是指標,指向函式

int (*fp)();

指標型函式是函式,返回指標

int * pf();

c++中怎麼在類中定義一個返回指標的函式

13樓:匿名使用者

#include

using namespace std;

class list;

struct node;

node* staddend(node*head,data data);

private:

static node * head;

};//外面試用類中類時,要加list::

list::node* list::staddend(list::node*head,list::data data){}

int main()

其實還是建議把data和node的定義放到list前面。

愛情裡一定要有性嗎,愛情一定要有性嗎???????

舜皛 著什麼急呢?反正遲早都是你的人啊 多給她點尊重 看得出她是一個很保守的女人 現在這樣的女人多難得 看看你身邊的朋友的女朋友 多不檢點 難道你希望你女朋友是這種人?那我也沒辦法了 有愛才有性,的基本在於愛,如果你愛她,你們也以後一定會在一起,那麼等到真正結婚的那天,再得到她,讓她覺得你不是因為性...

現在結婚一定要有房子嗎,結婚一定要有房子嗎?

小洋說財商 其實房地產也只是一種商品,商品都有周期,過去20年是閉眼買房也能賺錢的時代,但未來未必 客觀事實告訴我們 脫離經濟能力的愛情是不現實的 是不可行的當然 這不代表結婚一定要有房子 你首先要考慮 你願意你的愛人沒有房子跟你過嗎?你愛人的父母會願意自己的孩子跟你過嗎?如果 真的很無奈 現狀卻是...

細胞一定要有細胞核嗎一定要有染色體嗎擬核是什麼

紅細胞既沒有細胞核也沒有染色體。擬核是原核細胞內dna聚集的地方,類似於真核細胞的細胞核,但沒有核膜和和核仁 真核細胞有細胞核,原核細胞就沒有細胞核。染色體也是dna的一種組織形式,原核細胞中就沒有,它的dna存在形式是質粒。擬核是細菌的核區,類似真核細胞的細胞核,但結構相對簡單,沒有核膜和核仁。樓...