1. 程式人生 > 實用技巧 >5 void 分析

5 void 分析

目錄

函式定義中 void 的意義

  • 如果一個函式定義沒有顯式地指明返回值和引數,那麼預設的返回值型別是 int,引數可以是任意個

    #include <stdio.h>
    
    f()
    {
        printf("f()\n");
    }
    
    int main()
    {
        int i = f();
        int j = f(1, 2);
        int k = f(1, 2, 3);
    
        return 0;
    }
    
    //輸出結果
    f()
    f()
    f()
    
  • void 修飾函式的返回值和引數

    • 如果函式沒有返回值,那麼應該將其宣告為 void
    • 如果函式沒有引數,應該宣告其引數為 void
    • void 修飾函式返回值和引數是為了表示“無”

void 指標的意義

  • C語言規定只有相同型別的指標才可以相互賦值

  • void* 指標作為左值用於“接收”任意型別的指標

  • void* 指標作為右值使用時需要進行強制型別轉換

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int* pI = (int*)malloc(sizeof(int));
        char* pC = (char*)malloc(sizeof(char));
        void* p = NULL;
        int* pni = NULL;
        char* pnc = NULL;
    
        p = pI;  //void*指標作為左值使用
        pni = p;  //error:void*指標作為右值使用需要進行強制型別轉換
    
        p = pC;  //void*指標作為左值使用
        pnc = p;  //error:void*指標作為右值使用需要進行強制型別轉換
    
        return 0;
    }
    
  • 通過 void* 實現 MemSet 函式

    • 函式作用:將一段記憶體中的每個位元組都設定為一個固定的數
    #include <stdio.h>
    #include <stdlib.h>
    
    //void*:可以接受任意型別的指標
    void MemSet(void* src, int length, unsigned char n)
    {
        //定義一個位元組的指標
        unsigned char* p = (unsigned char*)src;
    
        int i = 0;
    
        for (i = 0; i < length; i++) {
            p[i] = n;
        }
    }
    
    int main()
    {
        int a[5];
        int i = 0;
    
        //都設定為0
        MemSet(a, sizeof(a), 0);
    
        for (i = 0; i < 5; i++) {
            printf("%d\n", a[i]);
        }
    
        
        char c[6];
        //都設定為1
        MemSet(c, sizeof(c), 1);
    
        for (i = 0; i < 6; i++) {
            printf("%d\n", c[i]);
        }
    
        return 0;
    }