淺談void 和void*

空類型 void 空類型指針void* 總結:
1. 什麼是void
void 是空類型 ,不指向任何類型 ,用在兩個地方:
(1) 當函數不返回任何值時 函數的返回類型應該是void 而不是缺省狀態,在缺省狀態下函數的默認返回類型爲 int
(2) 當函數不接受任何類型的參數時,參數列表應該爲void 而不是 缺省狀態,缺省狀態是表明函數可以接受任何類型 ,任何個數的參數
如:
void fun1(void);//函數fun1 不接受任何類型的參數,函數不返回任何值
fun2();// 函數fun2可以接受任何類型任何個數的參數,函數返回值爲 int 類型
2. 什麼是void*
void* 是空指針類型,可以接受任何指針類型的賦值,但不可以賦值給任何實體指針類型,也不能進行任何指針類型的操作 如解地址,主要用在 對內存的管理中。
如內存拷貝函數:
void * memcpy(void *dest, const void *src, size_t len);

int a = 2;
int* p = & a;
void* p1;
p1 = p;//可以 ,因爲void* 可以接受任何指針類型的賦值
p = p1;// 不行,因爲不可以將void*賦值給任何實體類型的指針

#include<iostream>
using namespace std;
int main(void){
    int  a  =3;//聲明瞭一個整形變量 a 並且給它賦予初值 3 ,此時  變量 a=3
    int  b = 4; //聲明瞭一個整形變量 b 並且給它賦予初值 4,此時  變量 b=4

cout << "a=" << a << endl;
cout << "b=" << b << endl;

int * p1 = & a ;//聲明瞭一個 整形指針變量p1 並且把 a變量的地址賦給p1,此時p1 指向變量a
int * p2 = & b;//聲明瞭一個整形變量p2並且把b變量的地址賦給p2 此時p2 指向變量b

//輸出p1 的值 也就是p1 的地址
cout<< " p1的值: " << p1 << endl;
// 輸出a的地址
cout <<" a的地址:"<< static_cast< const void* > (&a) << endl;

p1 = p2 ;//把p2 的地址賦值給p1 此時p1,p2 都指向了變量b 的地址(可以進行賦值,因爲 指針變量p1 和指針變量p2 都是 int* 類型)
cout<< "p1 的值:" << p1 << endl;
cout << "p2 的值:" << p2 << endl;

//輸出變量b的地址
cout<< "b 的地址 :"<<  static_cast<const void* >(&b)<< endl;

float  c  = 4.0; // 聲明瞭一個float類型的變量c  並且賦予初值 4.0
float*  p3  = & c ;//聲明瞭一個float類型的指針p3,並且把變量c的地址賦值給p3
cout<<"p3的值:" << p3 << endl;
cout<<"變量c 的地址:"<< static_cast<const void*>(&c)<<endl;// 輸出變量c的地址值

//p1  = p3;//試圖把 float* 類型的指針變量賦值給 int* 類型(失敗)

//強制類型轉換 :把指向float* 類型的p3 強制轉換爲 int* 然後在賦值給 指向int* 的p1 ,此時p1 ,p3 ,&c 都是同一地址 
p1 = (int*)(p3);
cout<< "p1的值:" << p1 << endl;// 輸出p1 的值
cout<< "p3的值:" << p3 << endl;// 輸出指針p3 的值
cout<< "c的地址:"<< static_cast<const void*>(&c) << endl;// 輸出變量 c的地址

//是否有什麼缺陷?分別輸出其內存中所存的變量
cout<< "p1內存中所存的變量值:"<< *p1 << endl;
cout<< "p3 內存中所存的變量值:"<< *p3 << endl;
cout<< " 變量c的值:" << c << endl;

//由上述的運行結果可知 p1 內存中的變量值並不是 c的值 ,所以這種強制類型轉換有很大的缺陷,下面進行藉助void* 
void* p4 ;//聲明瞭一個void*類型的指針型變量 可以接受任何類型的指針賦值,但不可以把void* 賦值給任何一種類型

p4 = p2; //講一個 指向整形變量的指針int*的變量 p2賦值給 void* 類型的指針型變量, 此時p2 p4 都指向了p2 也就是b的地址
cout <<"p2的值:"<< p2 << endl;
cout << "p4的值:"<< p4 << endl;
cout <<" 變量b的地址值:"<< static_cast<const void* >(&b)<< endl;

//分別通過解地址法 *p4 ,*p2 獲得p4,p2的內容
//cout<<"p4所指內存中所存的變量值:"<<*p4 << endl;
//void* 不能進行任何指針類型的操作(如 解地址*p4)
cout<<"p2所指內存中所存的變量值:"<< *p2 << endl;
cout << " b的值: " << b << endl;

//p2 = p4;
// 這一句會出現語法錯誤 ,報錯爲 不能將”void*“類型的值 分配到 ”int*“類型的實體

getchar();// 等待從鍵盤中輸入一個值目的用來觀察打印在屏幕上的值


    return 0;
}
發佈了31 篇原創文章 · 獲贊 15 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章