C語言中,*類型就是指針類型,比如 int *p,double q,雖然是不一樣的指針,但是大小卻一樣sizeof(p) == sizeof(q),因?yàn)樗鼈兌际峭环N類型類型的。C語言是強(qiáng)類型的語言,對類型的區(qū)分十分嚴(yán)格,不同的類型占據(jù)的空間大小不同,地址偏移量也會不同;
| 基本認(rèn)識
- void可以指向任何類型的地址,但是帶類型的指針不能指向void的地址
- void*指針只有強(qiáng)制類型轉(zhuǎn)換以后才可以正常取值
- void*指針變量和普通指針一樣可以通過等于0或者NULL來初始化,表示一個空指針
- 當(dāng)void*指針作為函數(shù)的輸入和輸出時,表示可以接受任意類型的輸入指針和輸出任意類型的指針
#include "stdio.h"
void *test(void *buff)
{
return buff;
}
int main()
{
int nums[] = {3, 5, 6, 7, 9};
// 初始化指針
void *p1 = NULL;
p1 = nums;
// 打印地址
printf("%d\\n", p1);
// 取值(報錯)
// printf("%d\\n", *p1);
// 取值(正常)
printf("%d\\n", *(int *)p1);
// 地址偏移(警告)
// printf("%d\\n", ++p1);
// 地址偏移(正常)
int *p2 = (int *)p1;
printf("%d\\n", p2++);
}
| 典型應(yīng)用
void*類型的指針其實(shí)本質(zhì)就是一個過渡型的指針狀態(tài),在編寫框架的時候就可以在不確定輸入的時候使用,典型的應(yīng)用有兩種:
函數(shù)傳參時不確定類型,或者要支持多類型的傳參
void function(int dataType, void* data) {
// 根據(jù)dataType的不同值,進(jìn)行不同的轉(zhuǎn)換
switch (dataType) {
case 0:
int* a = (int*)data;
case 1:
char* a = (char*)data;
...
}
}
當(dāng)函數(shù)的返回值不考慮類型指關(guān)心大小的時候
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
| 函數(shù)指針
各位第一眼看到下邊的函數(shù)有什么想法,是不是有種熟悉又陌生的感覺:
typedef void (*fun)(void *data1);
看看下面的用法:
#include "stdio.h"
// 定義一個函數(shù)類型
typedef void (*fun)(void *data1);
// 實(shí)例一個函數(shù)變量
fun test;
// 定義一個回調(diào)函數(shù)
void callBack(void *p1)
{
printf("%d\\n", *(int *)p1);
}
int main()
{
int a = 10;
test = callBack;
test(&a);
}
--END--
-
C語言
+關(guān)注
關(guān)注
180文章
7598瀏覽量
136208 -
指針
+關(guān)注
關(guān)注
1文章
480瀏覽量
70511 -
sizeof
+關(guān)注
關(guān)注
0文章
9瀏覽量
6435
發(fā)布評論請先 登錄
相關(guān)推薦
評論