C語言中,*類型就是指針類型,比如 int *p,double q,雖然是不一樣的指針,但是大小卻一樣sizeof(p) == sizeof(q),因為它們都是同一種類型類型的。C語言是強類型的語言,對類型的區分十分嚴格,不同的類型占據的空間大小不同,地址偏移量也會不同;
| 基本認識
- void可以指向任何類型的地址,但是帶類型的指針不能指向void的地址
- void*指針只有強制類型轉換以后才可以正常取值
- void*指針變量和普通指針一樣可以通過等于0或者NULL來初始化,表示一個空指針
- 當void*指針作為函數的輸入和輸出時,表示可以接受任意類型的輸入指針和輸出任意類型的指針
#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++);
}
| 典型應用
void*類型的指針其實本質就是一個過渡型的指針狀態,在編寫框架的時候就可以在不確定輸入的時候使用,典型的應用有兩種:
函數傳參時不確定類型,或者要支持多類型的傳參
void function(int dataType, void* data) {
// 根據dataType的不同值,進行不同的轉換
switch (dataType) {
case 0:
int* a = (int*)data;
case 1:
char* a = (char*)data;
...
}
}
當函數的返回值不考慮類型指關心大小的時候
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
| 函數指針
各位第一眼看到下邊的函數有什么想法,是不是有種熟悉又陌生的感覺:
typedef void (*fun)(void *data1);
看看下面的用法:
#include "stdio.h"
// 定義一個函數類型
typedef void (*fun)(void *data1);
// 實例一個函數變量
fun test;
// 定義一個回調函數
void callBack(void *p1)
{
printf("%d\\n", *(int *)p1);
}
int main()
{
int a = 10;
test = callBack;
test(&a);
}
--END--
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
C語言
+關注
關注
180文章
7605瀏覽量
136904 -
指針
+關注
關注
1文章
480瀏覽量
70568 -
sizeof
+關注
關注
0文章
9瀏覽量
6439
發布評論請先 登錄
相關推薦
C語言中void指針的基本認識及典型應用
C語言中,*類型就是指針類型,比如 int *p,double *q,雖然是不一樣的指針,但是大小卻一樣sizeof(p) == sizeof(q),因為它們都是同一種類型*類型的。C語言是強類型的語言,對類型的區分十分嚴格,不同的類型占據的空間大小不同,地址偏移量也會不
發表于 02-01 09:26
?1108次閱讀
請問如何傳入void *指針給dll函數
Labview新手,要調用dll中的一個函數,它接收一個void *指針,然后把地址傳出來。我接著要用這個地址傳給它的另外一個函數。c語言的調用是這樣的。void *ptr.A(&ptr);B(ptr);請問labview該如何
發表于 05-02 13:57
IAR和Keil中void *指針編譯提示錯誤
void *p;int FuncInt(int x,int y){return 1;}int main(void){p = FuncInt;}上面這段代碼在Keil里面沒有錯誤和警告,在IAR里面
發表于 12-29 09:42
【設計技巧】指針的使用注意事項:空指針、指針賦值、void *指針
的類型多么復雜,比如一個特別大的結構體,它的指針和一個 char型指針的大小本質上是一樣的,因為指針就是起始地址。 正式由于這個原因,(void )型
發表于 08-20 08:30
談談void指針的一些妙用
關注+星標公眾號,不錯過精彩內容轉自 | 嵌入式客棧要比較靈活的使用C語言實現一些高層級的框架時,需要掌握一些進階編程技巧,這篇來談談void指針的一些妙用。測試環境采用 IAR for ...
發表于 01-26 07:20
什么是void指針?void指針有何功能
[導讀] 要比較靈活的使用C語言實現一些高層級的框架時,需要掌握一些進階編程技巧,這篇來談談void指針的一些妙用。測試環境采用 IAR for ARM 8.40.1什么是void指針
發表于 02-21 06:01
C語言void及void指針深層探索
1.概述 本文將對void關鍵字的深刻含義進行解說,并詳述void及void指針類型的使用方法與技巧。 2.void的含義
發表于 09-21 11:36
?166次下載
深入了解void指針背后的機理
當使用關鍵字void聲明指針變量時,它將成為通用指針變量。任何數據類型(char,int,float等)的任何變量的地址都可以賦值給void指針
發表于 05-06 09:49
?1360次閱讀
淺談void 型指針的高階用法
要比較靈活的使用C語言實現一些高層級的框架時,需要掌握一些進階編程技巧,這篇來談談void指針的一些妙用。測試環境采用 IAR for ARM 8.40.1 什么是void指針
STM32編程:void指針高階用法舉例,設計一個通用掉電存儲子系統
[導讀] 要比較靈活的使用C語言實現一些高層級的框架時,需要掌握一些進階編程技巧,這篇來談談void指針的一些妙用。測試環境采用 IAR for ARM 8.40.1什么是void指針
發表于 12-27 18:47
?10次下載
STM32編程:void指針高階用法
[導讀] 要比較靈活的使用C語言實現一些高層級的框架時,需要掌握一些進階編程技巧,這篇來談談void指針的一些妙用。測試環境采用 IAR fo...
發表于 02-07 11:14
?2次下載
一文揭秘C語言的void指針
void *表示一個“不知道類型”的指針,也就不知道從這個指針地址開始多少字節為一個數據。和用int表示指針異曲同工,只是更明確是“指針”。
評論