void指針和數組指針之間的轉換


由於void* 可以被任何指針賦值,所以以void*作為函數參數可以使得接口更容易接受不同類型的參數,不過需要注意的時,實際操作時還需要利用強制類型轉換,將指針轉換為原類型,否則在內存上會有問題。

    一般情況下void*不支持解引用,同樣不支持運算。(因為無法清楚知道所指地址的對象占用了多大的內存)

以下為數組指針的一些總結(T可參考int)

表達式 a指針指向 解釋 維數 數組中元素類型
T* a; T* 指向整數的指針 1維 整數指針
T a[m]; T(*) 指向整數數組頭 m維 整數
T* a[m]; T* (*) 指向整數的指針數組 m維 指針->整數
T a[m][n] T(*)[n] 指向整數數組的指針數組 m維 指針->整數數組

下面考慮函數調用void*參數再轉化為數組指針的幾個例子:

#include <iostream>
using namespace std;
int f1(void* arg){
    int* a1=(int*)arg;
    return *a1;
}
int f2(void* arg){
    int* b1=(int *)b1;
    return b1[0];
}
int f3(void* arg){
    int** d1=(int **)arg;
    return *d1[0];
}
int f4(void* arg){
    int(*c)[2]=(int(*)[2])arg;
    return c[0][0]; 
}
int main(int arg,char* argv[]){
    int a=1;
    int e=5;
    int b[2]={1,2};
    int* d[2]={&a,&e};
    int c[2][2]={1,2,3,4};
    cout<<f1(&a)<<"\n"<<f2(b)<<"\n"<<f3(d)<<"\n"
        <<f4(c)<<endl;
    return 0;
}
//最后的輸出為1,9,5,4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM