大家在C語(yǔ)言的學(xué)習(xí)過(guò)程中肯定見(jiàn)過(guò)各種指針?lè)?hào),如 int*, char* 等等等等。顧名思義,int就是一個(gè)指向整形的指針,而char則是一個(gè)指向字符的指針,而 “ void* ”是什么呢?本期就為大家介紹 空指針
void指針一般被稱(chēng)為通用指針或叫泛指針。它是C語(yǔ)言關(guān)于純粹地址的一種約定。當(dāng)某個(gè)指針是void型指針時(shí),所指向的對(duì)象不屬于任何類(lèi)型。
1、void *表示一個(gè)“不知道類(lèi)型”的指針,也就不知道從這個(gè)指針地址開(kāi)始多少字節(jié)為一個(gè)數(shù)據(jù)。和用int表示指針異曲同工,只是更明確是“指針”。
因此void*只能表示一個(gè)地址,不能用來(lái)&取值,也不能移動(dòng)指針,因?yàn)椴恢蓝嗌僮止?jié)是一個(gè)數(shù)據(jù)單位。
2、void *就是一個(gè)不能動(dòng)的“地址”,在進(jìn)行&、移動(dòng)指針之前必須轉(zhuǎn)型為類(lèi)型指針。
3、指針在只知道內(nèi)存,但是不知道是什么類(lèi)型的時(shí)候。
4、在C/C++中,在任意時(shí)刻都可以使用其它類(lèi)型指針來(lái)代替void指針,或者用void指針來(lái)代替其他類(lèi)型指針。
5、對(duì)指針變量的解引用,使用間接運(yùn)算符*達(dá)到目的。但是在使用空指針的情況下,需要轉(zhuǎn)換指針變量解引用。這是因?yàn)榭罩羔槢](méi)有與之關(guān)聯(lián)的數(shù)據(jù)類(lèi)型。編譯器無(wú)法知道void指針指向的數(shù)據(jù)類(lèi)型。因此,要獲取由void指針指向的數(shù)據(jù),需要使用在void指針位置內(nèi)保存的正確類(lèi)型的數(shù)據(jù)進(jìn)行類(lèi)型轉(zhuǎn)換。
也就是說(shuō),void*類(lèi)型的指針可以接受任意類(lèi)型的指針
但是不能夠進(jìn)行解引用操作,也不能進(jìn)行加減運(yùn)算
需要注意的是,void* 即使在接收某一具體類(lèi)型的指針后,它的類(lèi)型依然是void*,我們?nèi)匀粺o(wú)法對(duì)其進(jìn)行解引用操作,需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換才可以。
由于空指針的特殊性,我們一般將其運(yùn)用在函數(shù)參數(shù)里,用以接收各種類(lèi)型的參數(shù)。
例:
void* e1;
*(int*)e1;
下面附帶一個(gè)有空指針參與的qsort(快速排序)函數(shù)
注1:由于qsort是庫(kù)函數(shù),因此我在編寫(xiě)時(shí)將函數(shù)名改為了 ‘my_qsort’
注2:此函數(shù)只是向大家展示空指針的應(yīng)用,其中仍有指針?lè)矫娴闹R(shí),我們會(huì)在后續(xù)章節(jié)具體介紹
qsort 函數(shù)
void swap(char*buf1,char*buf2,int width)
//交換函數(shù)
{
for (int i = 0;i < width;i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void my_qsort(void* base,int sz,int width, int (*cmp)(void* e1,void* e2))
{
for (int i = 0;i < sz;i++)
{ for (int j = 0;j < sz - 1 - i;j++)
{ //兩個(gè)元素的比較
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)
{ //交換
swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
}
}
}
}int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, sz, sizeof(arr[0]), cmp_int);}
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7630瀏覽量
140416 -
Int
+關(guān)注
關(guān)注
0文章
24瀏覽量
16210 -
符號(hào)
+關(guān)注
關(guān)注
0文章
55瀏覽量
4535
發(fā)布評(píng)論請(qǐng)先 登錄
C語(yǔ)言中void指針的基本認(rèn)識(shí)及典型應(yīng)用
C語(yǔ)言中的基本數(shù)據(jù)類(lèi)型

C預(yù)處理與C語(yǔ)言基本數(shù)據(jù)類(lèi)型
C程序的運(yùn)行環(huán)境和C語(yǔ)言的數(shù)據(jù)類(lèi)型
C語(yǔ)言void及void指針深層探索
C語(yǔ)言教程之檢查字符類(lèi)型
C語(yǔ)言教程之顯卡類(lèi)型測(cè)試
淺談void 型指針的高階用法

STM32編程:void指針高階用法舉例,設(shè)計(jì)一個(gè)通用掉電存儲(chǔ)子系統(tǒng)

C語(yǔ)言-void類(lèi)型作為萬(wàn)能指針類(lèi)型
一文揭秘C語(yǔ)言的void指針
什么是void指針
C語(yǔ)言的數(shù)據(jù)類(lèi)型-2

如何理解C++中的void?

C語(yǔ)言數(shù)據(jù)類(lèi)型有哪些

評(píng)論