1. 程式人生 > >c語言建立函式時void *與 void做修飾符的區別

c語言建立函式時void *與 void做修飾符的區別

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void fun1(){
    printf(" void fun , no return\n");
}


void fun2(){
    printf(" void fun , has return\n");
    return;
}

void  *fun(){
    printf(" void pointer fun , has return\n");
    return NULL;
}


int main(int argc, char* argv[])
{

    fun1();
    fun2();

    void *(*ptr)()=fun;
    void *execu=ptr();


    return 0;
}
關於函式型別修飾符的理解:
1,所有函式都是要返回的。有的函式返回時需要某些攜帶固定的型別的數值,叫做有返回值函式。有些函式返回時不需要攜帶數值,叫做無返回值函式。
2,void修飾的函式代表無型別--無型別不是無返回。無返回的字面意思是沒有返回,而事實上是沒有無返回的函式(只有無返回值的函式)。
3,函式前面的型別修飾符,是修飾函式返回型別的。沒有返回值的函式,用來修飾返回值的部分當然是無型別(因為它根本就沒有返回值,沒有任何型別)。
4,對於c/c++,函式的定義和宣告必須要攜帶返回值修飾符,即使它根本沒有。
綜上:用void 修飾的函式,是因為沒有返回值,而又因為語法需要必須攜帶返回值修飾符,所以它的返回值修飾符用void。
對於 void *函式:
它已經變成了有返回值的函式,就想 int ,char, char *等等函式一樣。只是因為它的返回型別比較奇特,很多時候,這是因為我們在定義函式的時候既不知道它的返回型別是什麼,也不知道它需要返回多少個數值。
所以我們把返回值定義成 void *。這是一個指標,它指向一個我們可控的地址,在需要的時候,我們可以根據需要把它的內容轉換成我們需要的形式。
返回值的理解:
有返回值的函式,我們在返回的時候,必須顯式的寫出返回資料。所以,一個void *函式,它需要返回一個void *型指標。如果需要攜帶資料,它會指向一個我們準備返回的資料地址。
如果一個函式,我們定義了返回型別是void *,但是又不需要返回資料時,可以簡單的用 return NULL。這不是無返回,而是我們返回了一個沒有攜帶資料的空指標。
沒有返回值的函式,我們需要在函式結束時寫 return; 當然也可以不寫。如果我們不寫,不是它不返回了,而是在編譯時,計算機會幫我們加上這句話。