一文帶你快速了解C/C++標準庫中的ptrdiff_t
簡介
ptrdiff_t是C/C++標準庫中定義的一個與機器相關的數(shù)據(jù)類型。ptrdiff_t類型變量通常用來保存兩個指針減法操作的結果。
ptrdiff_t定義在stddef.h(cstddef)這個文件內。
ptrdiff_t通常被定義為long int類型。
ptrdiff_t定義在C99標準中。
標準庫類型(library type)ptrdiff_t 與 size_t 類型一樣,ptrdiff_t也是一種與機器相關的類型,在 cstddef標準庫頭文件中定義。size_t 是unsigned 類型,而 ptrdiff_t 則是 signed 整型。
這兩種類型的差別體現(xiàn)了它們各自的用途:size_t類型用于指明數(shù)組長度,它必須是一個正數(shù);ptrdiff_t 類型則應保證足以存放同一數(shù)組中兩個指針之間的差距,它有可能是負數(shù)。
示例
#include <stdio.h> #include <stddef.h> #include <string.h> int main(void) { char str[] = "Hello world!"; char* pstart = str; char* pend = str + strlen(str); ptrdiff_t difp = pend - pstart; printf("%d\n", difp); return 0; }
存在的意義?
在編譯器中我嘗試過用int接收兩個指針的差距離,既然可以用int來表示,那他存在的意義是什么的,難道只是優(yōu)雅嗎?(優(yōu)雅還是很重要的!)
size_t/ptrdiff_t數(shù)據(jù)類型是和機器相關的。其sizeof字節(jié)長度和指針字節(jié)長度是一致的。
根據(jù)上表,我們可以看到指針的字節(jié)長度:
- 16 bit系統(tǒng)中,占用2字節(jié)(arduino nano)
- 64 bit系統(tǒng)中,占用8字節(jié)(vc64/ios模擬器)
- 32 bit系統(tǒng)中,占用4字節(jié)(除了上述3個系統(tǒng)外)
這種與機器類型相關的數(shù)據(jù)類型,我們可以稱為機器相關數(shù)據(jù)類型
如果現(xiàn)在有個需求,我需要跨平臺的使用統(tǒng)一數(shù)據(jù)類型來表示指針地址范圍,該怎么辦?
答: 兩種方式:
- typedef long long int64;
使用最大字節(jié)長度的數(shù)據(jù)類型來容納各個平臺下的地址數(shù)據(jù) - 使用c/c++預先定義的機器相關數(shù)據(jù)類型: size_t/ptrdiff_t
補充:ptrdiff_t與size_t的區(qū)別
標準庫類型(library type)ptrdiff_t 與 size_t 類型一樣,ptrdiff_t 也是一種與機器相關的類型,在cstddef 頭文件中定義。
size_t 是unsigned 類型,而 ptrdiff_t 則是 signed 整型
size_t類型用于指明數(shù)組長度,它必須是一個正數(shù);ptrdiff_t 類型則應保證足以存放同一數(shù)組中兩個指針之間的差距,它有可能是負數(shù)
總結
到此這篇關于C/C++標準庫中ptrdiff_t的文章就介紹到這了,更多相關C/C++標準庫中ptrdiff_t內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Matlab制作視頻并轉換成gif動態(tài)圖的兩種方法
這篇文章主要介紹了Matlab制作視頻并轉換成gif動態(tài)圖的兩種方法,第一種方法使用movie(f)直接取生成AVI視頻文件,相對來說比較簡單,需要的朋友可以參考下2018-08-08SQL Server中的數(shù)據(jù)復制到的Access中的函數(shù)
SQL Server中的數(shù)據(jù)復制到的Access中,表的結構相同 不要提用openrowset,因為Access文件和SQL Server不在一臺機器上2008-11-11