網(wǎng)站首頁 編程語言 正文
在C語言中,void
稱為無類型,相應的void*
稱為無類型指針或者空指針類型。
void的應用
對函數(shù)返回值的限定。
例如void func(int);
該函數(shù)沒有返回值。對函數(shù)參數(shù)類型的限定。
例如int func(void);
該函數(shù)沒有參數(shù),不允許接收參數(shù)。
空指針類型(void*)
空指針類型的變量void* pvoid;
可以指向任意類型的數(shù)據(jù),任何類型的指針也可以直接賦值給空指針類型的變量。
#include <stdio.h> int main() { char c, *pc; int i, *pi; double d, *pd; void *pvoid; pc = &c; pvoid = pc; printf("pvoid = %p &c = %p\n", pvoid, &c); pi = &i; pvoid = pi; printf("pvoid = %p &i = %p\n", pvoid, &i); pd = &d; pvoid = pd; printf("pvoid = %p &d = %p\n", pvoid, &d); }
/*
輸出結(jié)果
pvoid = 000000000061FDFF ?&c = 000000000061FDFF
pvoid = 000000000061FDF8 ?&i = 000000000061FDF8
pvoid = 000000000061FDF0 ?&d = 000000000061FDF0
*/
但是如果空指針類型的變量賦值給任意指針類型的變量,就需要強制轉(zhuǎn)換;也就是顯式說明該指針指向的內(nèi)存中是存放的什么類型的數(shù)據(jù)。
void *pvoid; int *pi; char *pc; double *pd; pi = (int*)pvoid; pc = (char*)pvoid; pd = (double*)pd;
另外,以下有些需要注意的地方。
在 ANSI C 標準中,不允許對 void 指針進行一些算術(shù)運算如 p++ 或 p+=1 等。因為既然 void 是無類型,那么每次算術(shù)運算我們就不知道該操作幾個字節(jié),例如 char 型操作 sizeof(char) 字節(jié),而 int 則要操作 sizeof(int) 字節(jié)。而在 GNU 中則允許,因為在默認情況下,GNU 認為 void * 和 char * 一樣,既然是確定的,當然可以進行一些算術(shù)操作,在這里sizeof(*p)==sizeof(char)
。
int i; void *pvoid; pvoid = &i; printf("%p\n", pvoid); pvoid++;//ANSI:錯誤;GNU:正確 pvoid += 1;//ANSI:錯誤;GNU:正確 printf("%p\n", pvoid);
在實際的程序設(shè)計中,為迎合 ANSI 標準,并提高程序的可移植性,我們可以這樣編寫實現(xiàn)同樣功能的代碼:
((int*)pvoid)++; (int*)pvoid += 1;
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注AB教程網(wǎng)的更多內(nèi)容!
原文鏈接:https://blog.csdn.net/qq_45607873/article/details/123794870
相關(guān)推薦
- 2023-01-12 C#實現(xiàn)讀寫ini配置文件的方法詳解_C#教程
- 2022-04-18 后端接口返回一個圖片地址,前端h5,pc瀏覽器,下載圖片文件,而不是預覽
- 2023-01-14 Linux命令行查看cpu(lm_sensors)和顯卡溫度(nvidia-smi)的操作方法_li
- 2023-07-02 python中編寫config文件并及時更新的方法_python
- 2022-11-27 Git基礎(chǔ)學習之標簽tag的使用詳解_相關(guān)技巧
- 2022-06-02 C++超詳細講解單鏈表的實現(xiàn)_C 語言
- 2022-03-24 C語言函數(shù)指針詳解_C 語言
- 2022-09-23 Pandas時間類型轉(zhuǎn)換與處理的實現(xiàn)示例_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支