C++使用ZLIB庫(kù)實(shí)現(xiàn)目錄壓縮與解壓功能
C++ 使用ZLIB庫(kù)實(shí)現(xiàn)目錄壓縮與解壓
在軟件開(kāi)發(fā)和數(shù)據(jù)處理中,對(duì)數(shù)據(jù)進(jìn)行高效的壓縮和解壓縮是一項(xiàng)重要的任務(wù)。這不僅有助于減小數(shù)據(jù)在網(wǎng)絡(luò)傳輸和存儲(chǔ)中的占用空間,還能提高系統(tǒng)的性能和響應(yīng)速度。本文將介紹如何使用 zlib 庫(kù)進(jìn)行數(shù)據(jù)的壓縮和解壓縮,以及如何保存和讀取壓縮后的文件。 zlib 是一個(gè)開(kāi)源的數(shù)據(jù)壓縮庫(kù),旨在提供高效、輕量級(jí)的壓縮和解壓縮算法。其核心壓縮算法基于 DEFLATE,這是一種無(wú)損數(shù)據(jù)壓縮算法,通常能夠提供相當(dāng)高的壓縮比。zlib 庫(kù)廣泛應(yīng)用于多個(gè)領(lǐng)域,包括網(wǎng)絡(luò)通信、文件壓縮、數(shù)據(jù)庫(kù)系統(tǒng)等。
1、保存文件
使用 CreateFile 打開(kāi)文件,通過(guò) WriteFile 向文件中寫出數(shù)據(jù),最后調(diào)用 CloseHandle 關(guān)閉句柄,實(shí)現(xiàn)文件的保存。
// ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 // #include "stdafx.h" #define ZLIB_WINAPI #include <string> #include <iostream> #include <vector> #include <Shlwapi.h> #include <zip.h> #include <unzip.h> #include <zlib.h> using namespace std; #pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "zlibstat.lib") BOOL SaveToFile(wchar_t *pszFileName, BYTE *pData, DWORD dwDataSize) { wchar_t szSaveName[MAX_PATH] = { 0 }; lstrcpy(szSaveName, pszFileName); HANDLE hFile = CreateFile(szSaveName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL); if (INVALID_HANDLE_VALUE == hFile) { return FALSE; } DWORD dwRet = 0; WriteFile(hFile, pData, dwDataSize, &dwRet, NULL); CloseHandle(hFile); return TRUE; } int _tmain(int argc, _TCHAR* argv[]) { char szBuffer[1024] = { 0 }; strcpy_s(szBuffer,sizeof("test__123123"), "test__123123"); SaveToFile(L"F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.txt", (BYTE *)szBuffer, sizeof(szBuffer)); system("pause"); return 0; }
這段代碼是一個(gè)簡(jiǎn)單的C++控制臺(tái)應(yīng)用程序,它定義了一個(gè)函數(shù) SaveToFile 來(lái)將數(shù)據(jù)保存到文件,并在 main 函數(shù)中測(cè)試這個(gè)功能。下面是這段代碼的中文解釋:
- 頭文件包含部分:
這里包含了程序所需的頭文件。
stdafx.h 是預(yù)編譯頭文件,用于加速編譯過(guò)程。ZLIB_WINAPI 宏定義表明我們將在Windows API模式下使用zlib庫(kù)。其他包含的文件提供了字符串操作、輸入輸出流、向量容器和文件路徑操作的功能。zip.h、unzip.h和zlib.h是zlib庫(kù)的一部分,用于壓縮和解壓縮文件。
- 庫(kù)鏈接指令:
#pragma comment(lib, “Shlwapi.lib”)
#pragma comment(lib, “zlibstat.lib”)
這些行指示鏈接器鏈接到 Shlwapi.lib(Shell輕量級(jí)實(shí)用工具庫(kù))和 zlibstat.lib(zlib靜態(tài)庫(kù))。
- SaveToFile 函數(shù):
SaveToFile 函數(shù)接受一個(gè)文件名、一個(gè)指向數(shù)據(jù)的指針和數(shù)據(jù)的大小,然后創(chuàng)建一個(gè)文件并將數(shù)據(jù)寫入該文件。
- _tmain 函數(shù):
_tmain 是程序的入口點(diǎn)。在這里,它創(chuàng)建了一個(gè)字符數(shù)組szBuffer,使用strcpy_s函數(shù)將字符串 “test 123123” 復(fù)制到szBuffer中,然后調(diào)用SaveToFile函數(shù)將這個(gè)緩沖區(qū)保存到硬盤上的一個(gè)文件中。
- SaveToFile 函數(shù)的具體操作:
定義一個(gè)寬字符數(shù)組szSaveName用于存放將要保存的文件的路徑。
使用lstrcpy函數(shù)將傳入的文件路徑pszFileName復(fù)制到szSaveName。
調(diào)用CreateFile函數(shù)創(chuàng)建或覆蓋文件szSaveName。
在這段代碼中,調(diào)用CreateFile函數(shù)創(chuàng)建或覆蓋文件szSaveName的行為體現(xiàn)在CreateFile函數(shù)的dwCreationDisposition參數(shù)上。在這個(gè)例子中,這個(gè)參數(shù)被設(shè)置為CREATE_ALWAYS。
CREATE_ALWAYS是CreateFile函數(shù)的一個(gè)選項(xiàng),它指示操作系統(tǒng),無(wú)論目標(biāo)文件是否存在,都創(chuàng)建一個(gè)新文件。如果文件已經(jīng)存在,使用CREATE_ALWAYS會(huì)導(dǎo)致現(xiàn)有文件被覆蓋。這意味著,如果szSaveName指定的文件已經(jīng)存在于磁盤上,它將被新文件替換,從而體現(xiàn)了"覆蓋"的行為。
簡(jiǎn)而言之,通過(guò)使用CREATE_ALWAYS作為dwCreationDisposition的參數(shù)值,CreateFile函數(shù)在這段代碼中不僅可以用來(lái)創(chuàng)建一個(gè)新文件,也可以用來(lái)覆蓋一個(gè)已經(jīng)存在的文件。如果操作成功,舊的文件內(nèi)容會(huì)被丟棄,并開(kāi)始寫入新的內(nèi)容;如果操作失敗,例如由于權(quán)限問(wèn)題或路徑問(wèn)題,函數(shù)將返回INVALID_HANDLE_VALUE。
如果目的是追加內(nèi)容到一個(gè)已存在的文件,而不是覆蓋它,你可以使用CreateFile函數(shù)的另一個(gè)參數(shù)選項(xiàng) OPEN_EXISTING或OPEN_ALWAYS,配合文件指針移動(dòng)函數(shù)SetFilePointer和寫入函數(shù)WriteFile來(lái)實(shí)現(xiàn)。
OPEN_EXISTING: 打開(kāi)文件僅當(dāng)它存在。如果文件不存在,CreateFile將失敗。
OPEN_ALWAYS: 打開(kāi)文件如果它存在,如果不存在則創(chuàng)建一個(gè)新文件。這與CREATE_ALWAYS不同,因?yàn)镃REATE_ALWAYS會(huì)覆蓋已存在的文件,而OPEN_ALWAYS在文件已存在時(shí)不會(huì)覆蓋現(xiàn)有內(nèi)容。
- 為了追加內(nèi)容,可以這樣做:
使用CreateFile函數(shù)打開(kāi)(或創(chuàng)建)文件,dwCreationDisposition參數(shù)使用OPEN_ALWAYS。
調(diào)用SetFilePointer函數(shù)將文件指針移動(dòng)到文件末尾。SetFilePointer的dwMoveMethod參數(shù)設(shè)置為FILE_END,lDistanceToMove設(shè)置為0,這樣文件指針就會(huì)定位到文件的末尾,準(zhǔn)備追加內(nèi)容。
使用WriteFile函數(shù)寫入新內(nèi)容,寫入的內(nèi)容將添加到文件的末尾,而不是覆蓋原有內(nèi)容。
以下是示例代碼,展示如何修改SaveToFile函數(shù)以追加內(nèi)容到文件而不是覆蓋:
BOOL AppendToFile(wchar_t *pszFileName, BYTE *pData, DWORD dwDataSize) { wchar_t szSaveName[MAX_PATH] = { 0 }; lstrcpy(szSaveName, pszFileName); // 使用OPEN_ALWAYS選項(xiàng)打開(kāi)或創(chuàng)建文件 HANDLE hFile = CreateFile(szSaveName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { return FALSE; } // 將文件指針移動(dòng)到文件末尾 SetFilePointer(hFile, 0, NULL, FILE_END); DWORD dwRet = 0; WriteFile(hFile, pData, dwDataSize, &dwRet, NULL); CloseHandle(hFile); return TRUE; }
如果文件創(chuàng)建成功,使用WriteFile函數(shù)將傳入的數(shù)據(jù)pData寫入文件。
關(guān)閉文件句柄并返回操作結(jié)果。
- _tmain 函數(shù)的具體操作:
定義一個(gè)緩沖區(qū)szBuffer并使用strcpy_s安全復(fù)制函數(shù)初始化這個(gè)緩沖區(qū)。
調(diào)用SaveToFile函數(shù),將szBuffer中的數(shù)據(jù)保存到F:\vs2013_code\ConsoleApplication2\Debug\1.txt。
程序暫停等待用戶操作,之后退出。
整個(gè)程序的目的是演示如何安全地將數(shù)據(jù)寫入到文件中,并在主函數(shù)中測(cè)試這個(gè)功能。程序?qū)⒆址?“test 123123” 保存到指定的文本文件中。
2、文件壓縮
compress 是 zlib 庫(kù)提供的用于數(shù)據(jù)壓縮的函數(shù),通過(guò)該函數(shù)可以將數(shù)據(jù)進(jìn)行壓縮。下面是一個(gè)示例,演示了如何使用 zlib 庫(kù)進(jìn)行文件壓縮。
它的原型如下:
int compress(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen);
- dest:指向存放壓縮后數(shù)據(jù)的緩沖區(qū)的指針。
- destLen:傳入時(shí)為壓縮緩沖區(qū)的大小,傳出時(shí)為實(shí)際壓縮后數(shù)據(jù)的大小。
- source:指向待壓縮數(shù)據(jù)的緩沖區(qū)的指針。
- sourceLen:待壓縮數(shù)據(jù)的大小。
- dest:指向存放壓縮后數(shù)據(jù)的緩沖區(qū)的指針。
- destLen:傳入時(shí)為壓縮緩沖區(qū)的大小,傳出時(shí)為實(shí)際壓縮后數(shù)據(jù)的大小。
- source:指向待壓縮數(shù)據(jù)的緩沖區(qū)的指針。
- sourceLen:待壓縮數(shù)據(jù)的大小。
compress 函數(shù)的作用是將 source 指向的數(shù)據(jù)進(jìn)行壓縮,并將結(jié)果存放在 dest 指向的緩沖區(qū)中。destLen 傳入時(shí)應(yīng)該是 dest 緩沖區(qū)的大小,函數(shù)執(zhí)行后,destLen 會(huì)更新為實(shí)際壓縮后數(shù)據(jù)的大小。
函數(shù)返回值為壓縮的執(zhí)行狀態(tài),可能的返回值包括:
- Z_OK:壓縮成功。
- Z_MEM_ERROR:內(nèi)存分配失敗。
- Z_BUF_ERROR:壓縮輸出緩沖區(qū)不足。
這個(gè)函數(shù)實(shí)際上是使用 DEFLATE 算法進(jìn)行壓縮,DEFLATE 是一種通用的壓縮算法,也是 zlib 庫(kù)的核心算法之一。壓縮后的數(shù)據(jù)可以使用` uncompress 函數(shù)進(jìn)行解壓縮。
總體而言,compress
函數(shù)提供了一種簡(jiǎn)單的方式,可以在應(yīng)用程序中對(duì)數(shù)據(jù)進(jìn)行壓縮,適用于需要減小數(shù)據(jù)體積的場(chǎng)景,比如網(wǎng)絡(luò)傳輸或數(shù)據(jù)存儲(chǔ)。
// 單個(gè)文件限制大小為 100M #define MAX_SRC_FILE_SIZE (100*1024*1024) /** * @brief 壓縮指定文件的數(shù)據(jù) * * @param pszCompressFileName 待壓縮文件的路徑 * @param ppCompressData 保存壓縮后數(shù)據(jù)的指針 * @param pdwCompressDataSize 傳入時(shí)為壓縮緩沖區(qū)的大小,傳出時(shí)為實(shí)際壓縮后數(shù)據(jù)的大小 * @return 壓縮是否成功,成功返回 TRUE,否則返回 FALSE */ BOOL CompressData(wchar_t*pszCompressFileName, BYTE **ppCompressData, DWORD *pdwCompressDataSize) { HANDLE hFile = CreateFile(pszCompressFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL); // 檢查文件句柄是否有效 if (INVALID_HANDLE_VALUE == hFile) { return FALSE; } // 獲取文件大小 DWORD dwFileSize = GetFileSize(hFile, NULL); // 檢查文件大小是否超過(guò)限制 if (MAX_SRC_FILE_SIZE < dwFileSize) { CloseHandle(hFile); return FALSE; } DWORD dwDestDataSize = dwFileSize; // 分配源數(shù)據(jù)和目標(biāo)數(shù)據(jù)的內(nèi)存 BYTE *pSrcData = new BYTE[dwFileSize]; if (NULL == pSrcData) { CloseHandle(hFile); return FALSE; } BYTE *pDestData = new BYTE[dwDestDataSize]; if (NULL == pDestData) { delete[] pSrcData; CloseHandle(hFile); return FALSE; } DWORD dwRet = 0; // 讀取源數(shù)據(jù) ReadFile(hFile, pSrcData, dwFileSize, &dwRet, NULL); // 檢查讀取是否成功 if ((0 >= dwRet) || (dwRet != dwFileSize)) { delete[] pDestData; delete[] pSrcData; CloseHandle(hFile); return FALSE; } int iRet = 0; // 壓縮數(shù)據(jù) do { iRet = compress(pDestData, &dwDestDataSize, pSrcData, dwFileSize); // 壓縮成功,退出循環(huán) if (0 == iRet) { break; } // 輸出緩沖區(qū)不足,增加緩沖區(qū)大小并重試 else if (-5 == iRet) { delete[] pDestData; pDestData = NULL; dwDestDataSize = dwDestDataSize + (100 * 1024); pDestData = new BYTE[dwDestDataSize]; // 分配新的目標(biāo)數(shù)據(jù)內(nèi)存 if (NULL == pDestData) { delete[] pSrcData; CloseHandle(hFile); return FALSE; } } // 壓縮失敗,釋放內(nèi)存并返回失敗 else { delete[] pDestData; pDestData = NULL; delete[] pSrcData; pSrcData = NULL; CloseHandle(hFile); return FALSE; } } while (TRUE); // 保存壓縮后數(shù)據(jù)的指針和實(shí)際大小 *ppCompressData = pDestData; *pdwCompressDataSize = dwDestDataSize; // 釋放源數(shù)據(jù)內(nèi)存 delete[] pSrcData; // 關(guān)閉文件句柄 CloseHandle(hFile); // 返回壓縮成功 return TRUE; }
3、文件解壓縮
uncompress
函數(shù)是 zlib
庫(kù)提供的用于數(shù)據(jù)解壓縮的函數(shù),通過(guò)該函數(shù)可以將壓縮后的數(shù)據(jù)解壓縮還原。下面是一個(gè)示例,演示了如何使用 zlib
庫(kù)進(jìn)行文件解壓縮。
它的原型如下:
int uncompress(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen);
- dest:指向存放解壓縮后數(shù)據(jù)的緩沖區(qū)的指針。
- destLen:傳入時(shí)為解壓縮緩沖區(qū)的大小,傳出時(shí)為實(shí)際解壓縮后數(shù)據(jù)的大小。
- source:指向待解壓縮數(shù)據(jù)的緩沖區(qū)的指針。
- sourceLen:待解壓縮數(shù)據(jù)的大小。
uncompress 函數(shù)的作用是將 source 指向的數(shù)據(jù)進(jìn)行解壓縮,并將結(jié)果存放在 dest 指向的緩沖區(qū)中。destLen 傳入時(shí)應(yīng)該是 dest 緩沖區(qū)的大小,函數(shù)執(zhí)行后,destLen 會(huì)更新為實(shí)際解壓縮后數(shù)據(jù)的大小。
函數(shù)返回值為解壓縮的執(zhí)行狀態(tài),可能的返回值包括:
- Z_OK:解壓縮成功。
- Z_MEM_ERROR:內(nèi)存分配失敗。
- Z_BUF_ERROR:解壓縮輸出緩沖區(qū)不足。
- Z_DATA_ERROR:輸入數(shù)據(jù)錯(cuò)誤或損壞。
uncompress 函數(shù)實(shí)際上是使用DEFLATE算法進(jìn)行解壓縮,與 compress 函數(shù)相對(duì)應(yīng)。這兩個(gè)函數(shù)共同構(gòu)成了 zlib 庫(kù)中的基本數(shù)據(jù)壓縮和解壓縮功能。
在實(shí)際應(yīng)用中,可以使用這兩個(gè)函數(shù)來(lái)處理需要壓縮和解壓縮的數(shù)據(jù),例如在網(wǎng)絡(luò)通信中減小數(shù)據(jù)傳輸量或在存儲(chǔ)數(shù)據(jù)時(shí)減小占用空間。
/** * @brief 解壓指定文件的數(shù)據(jù) * * @param pszUncompressFileName 待解壓文件的路徑 * @param ppUncompressData 保存解壓后數(shù)據(jù)的指針 * @param pdwUncompressDataSize 傳入時(shí)為解壓緩沖區(qū)的大小,傳出時(shí)為實(shí)際解壓后數(shù)據(jù)的大小 * @return 解壓是否成功,成功返回 TRUE,否則返回 FALSE */ BOOL UncompressData(wchar_t*pszUncompressFileName, BYTE **ppUncompressData, DWORD *pdwUncompressDataSize) { HANDLE hFile = CreateFile(pszUncompressFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL); // 檢查文件句柄是否有效 if (INVALID_HANDLE_VALUE == hFile) { return FALSE; } // 獲取文件大小 DWORD dwFileSize = GetFileSize(hFile, NULL); // 設(shè)置目標(biāo)數(shù)據(jù)緩沖區(qū)大小 DWORD dwDestDataSize = MAX_SRC_FILE_SIZE; // 分配源數(shù)據(jù)和目標(biāo)數(shù)據(jù)的內(nèi)存 BYTE *pSrcData = new BYTE[dwFileSize]; if (NULL == pSrcData) { CloseHandle(hFile); return FALSE; } BYTE *pDestData = new BYTE[dwDestDataSize]; if (NULL == pDestData) { delete[] pSrcData; CloseHandle(hFile); return FALSE; } DWORD dwRet = 0; // 讀取源數(shù)據(jù) ReadFile(hFile, pSrcData, dwFileSize, &dwRet, NULL); // 檢查讀取是否成功 if ((0 >= dwRet) || (dwRet != dwFileSize)) { delete[] pDestData; delete[] pSrcData; CloseHandle(hFile); return FALSE; } int iRet = 0; // 解壓縮數(shù)據(jù) do { iRet = uncompress(pDestData, &dwDestDataSize, pSrcData, dwFileSize); // 解壓縮成功,退出循環(huán) if (0 == iRet) { break; } // 輸出緩沖區(qū)不足,增加緩沖區(qū)大小并重試 else if (-5 == iRet) { delete[] pDestData; pDestData = NULL; dwDestDataSize = dwDestDataSize + (100 * 1024); pDestData = new BYTE[dwDestDataSize]; // 分配新的目標(biāo)數(shù)據(jù)內(nèi)存 if (NULL == pDestData) { delete[] pSrcData; CloseHandle(hFile); return FALSE; } } // 解壓縮失敗,釋放內(nèi)存并返回失敗 else { delete[] pDestData; pDestData = NULL; delete[] pSrcData; pSrcData = NULL; CloseHandle(hFile); return FALSE; } } while (TRUE); // 保存解壓后數(shù)據(jù)的指針和實(shí)際大小 *ppUncompressData = pDestData; *pdwUncompressDataSize = dwDestDataSize; // 釋放源數(shù)據(jù)內(nèi)存 delete[] pSrcData; // 關(guān)閉文件句柄 CloseHandle(hFile); // 返回解壓成功 return TRUE; }
4、演示示例
下面是一個(gè)包含文件壓縮和解壓縮的完整示例,展示了如何將文件進(jìn)行壓縮保存,然后解壓還原。
調(diào)用CompressData壓縮文件,返回結(jié)果pCompressData存放文件內(nèi)存字節(jié),結(jié)果dwCompressDataSize存放長(zhǎng)度,并調(diào)用SaveToFile保存到本地。
int main(int argc, char* argv[]) { BOOL bRet = FALSE; BYTE *pCompressData = NULL; DWORD dwCompressDataSize = 0; // 壓縮文件 bRet = CompressData(L"F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.txt", &pCompressData, &dwCompressDataSize); if (TRUE == bRet) { std::cout << "已壓縮" << std::endl; } // 保存壓縮數(shù)據(jù)為文件 bRet = SaveToFile(L"F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.zlib", pCompressData, dwCompressDataSize); if (TRUE == bRet) { std::cout << "已保存到文件" << std::endl; } // 釋放內(nèi)存 delete[]pCompressData; pCompressData = NULL; system("pause"); return 0; }
調(diào)用UncompressData解壓縮文件,返回結(jié)果pUncompressData存放文件內(nèi)存字節(jié),結(jié)果dwUncompressDataSize存放長(zhǎng)度,并調(diào)用SaveToFile保存到本地。
int main(int argc, char* argv[]) { BOOL bRet = FALSE; BYTE *pUncompressData = NULL; DWORD dwUncompressDataSize = 0; // 解壓文件 bRet = UncompressData("F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.zlib", &pUncompressData, &dwUncompressDataSize); if (TRUE == bRet) { std::cout << "已解壓" << std::endl; } // 保存解壓數(shù)據(jù)為文件 bRet = SaveToFile("F:\\vs2013_code\\ConsoleApplication2\\Debug\\1.txt", pUncompressData, dwUncompressDataSize); if (TRUE == bRet) { std::cout << "已保存到文件" << std::endl; } // 釋放內(nèi)存 delete[]pUncompressData; pUncompressData = NULL; system("pause"); return 0; }
編譯時(shí)可能會(huì)提示無(wú)法生成SAFESEH影響的報(bào)錯(cuò)信息,如下圖所示;
結(jié)論
通過(guò)使用 zlib 庫(kù),我們可以方便地在應(yīng)用程序中實(shí)現(xiàn)數(shù)據(jù)的壓縮和解壓縮功能。這對(duì)于需要減小數(shù)據(jù)傳輸量或在存儲(chǔ)數(shù)據(jù)時(shí)減小占用空間的場(chǎng)景非常有用。在實(shí)際應(yīng)用中,可以根據(jù)需要調(diào)整緩沖區(qū)大小和處理流程,以適應(yīng)不同的數(shù)據(jù)處理需求。
以上就是C++使用ZLIB庫(kù)實(shí)現(xiàn)目錄壓縮與解壓功能的詳細(xì)內(nèi)容,更多關(guān)于C++ ZLIB目錄壓縮與解壓的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言中的強(qiáng)符號(hào)和弱符號(hào)介紹
這篇文章主要介紹了C語(yǔ)言中的強(qiáng)符號(hào)和弱符號(hào)介紹,本文用多個(gè)實(shí)例來(lái)講解強(qiáng)符號(hào)和弱符號(hào),需要的朋友可以參考下2015-03-03C++實(shí)現(xiàn)LeetCode(769.可排序的最大塊數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(769.可排序的最大塊數(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語(yǔ)言行優(yōu)先和列優(yōu)先的問(wèn)題深入分析
這篇文章主要介紹了C語(yǔ)言行優(yōu)先和列優(yōu)先的問(wèn)題深入分析的相關(guān)資料,需要的朋友可以參考下2017-01-01C語(yǔ)言數(shù)組和指針,內(nèi)存之間的關(guān)系
這篇文章主要介紹了C語(yǔ)言數(shù)組和指針,內(nèi)存之間的關(guān)系,首先論證一維數(shù)組和一級(jí)指針之前的關(guān)系,我們常常使用一級(jí)指針指針的方式訪問(wèn)一維數(shù)組,只有對(duì)內(nèi)存的理解到位才能理解它們直接的關(guān)系。需要的小伙伴可以參考一下2022-02-02