c++ 二级指针详解&&hiredis api
最近在基于redis的c客戶(hù)端hiredis做擴(kuò)展的時(shí)候, 其中一個(gè)函數(shù)需要接受一個(gè)const char **的二級(jí)指針作為參數(shù):
void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
這個(gè)函數(shù)主要是用于 需要傳遞多個(gè)string值的場(chǎng)景,類(lèi)似于 lpush, del key1 key2..., zadd key score1 member1 score2 member2...這類(lèi)命令, 其中 argc是傳遞參數(shù)的個(gè)數(shù), argv主要用于傳遞的string的value, 而argvlen 是每個(gè)string的size, 這里不講解這個(gè)函數(shù)的具體用法,主要談下如何構(gòu)造這樣一樣二級(jí)指針,也算對(duì)c/c++基礎(chǔ)內(nèi)容的一個(gè)回顧。
我們都知道, 指針是c/c++中一種非常有用的數(shù)據(jù)類(lèi)型, 用于存儲(chǔ)一個(gè)數(shù)據(jù)的地址。一個(gè)指針有三種狀態(tài): 保存一個(gè)特定對(duì)象的地址; 指向某一個(gè)特定對(duì)象后邊的某一個(gè)對(duì)象; 0值。 另外, 我們?cè)诙x一個(gè)指針的時(shí)候, 一定要記得初始化: int *p = 0。 指針有一級(jí)指針和多級(jí)指針之分, 一級(jí)指針比較簡(jiǎn)單,也比較好理解。而多級(jí)指針,就需要花點(diǎn)心思了,特別是c/c++這類(lèi)需要手動(dòng)管理內(nèi)存的語(yǔ)言,使用的時(shí)候,更是要謹(jǐn)慎。
當(dāng)我們?cè)谑褂眠@個(gè)函數(shù)執(zhí)行redis命令的時(shí)候, 所傳遞的string的個(gè)數(shù)通常是不確定的;所以這里就沒(méi)法使用數(shù)組了(我們知道, 一維數(shù)組可以作為一級(jí)指針使用, 二維數(shù)組可以使用二級(jí)指針使用), 得使用動(dòng)態(tài)內(nèi)存分配了,代碼實(shí)例:
int getCommandArgv(const vector<string> &vecArgs, char **&argv) {
int argsLen = vecArgs.size();
char **arrArgv = new char*[argsLen];
vector<string>::const_iterator it = vecArgs.begin();
for (; it != vecArgs.end(); it++) {
string tmpArgs = (*it);
arrArgv[i] = new char[tmpArgs.size()];
memcpy(arrArgv[i], tmpArgs.c_str(), tmpArgs.size());
i++;
}
for (int i = 0; i < argc; i++) {
if (argv[i] != NULL) {
delete [] argv[i];
argv[i] = NULL;
}
}
delete [] argv;
argv = NULL;
return 0;
}
如代碼所示,展示了如何把一個(gè)保存string的vector如何存儲(chǔ)到一個(gè)char ** 的二級(jí)指針中。在給二級(jí)指針?lè)峙鋬?nèi)容的時(shí)候, 不僅要給這個(gè)二級(jí)指針?lè)峙鋬?nèi)存,同時(shí),也要給它里邊的每一個(gè)元素分配內(nèi)存; 但最后一定不要忘了釋放內(nèi)存哦, 釋放的時(shí)候, 需要先釋放其中每一個(gè)元素指向的內(nèi)存空間, 最后在釋放這個(gè)二級(jí)指針指向的內(nèi)存空間。
最后, 講一下指針和const限定符。 根據(jù)《c++ primer》 里邊描述的, 有 1: 指向const對(duì)象的指針, 2: const指針, 前者是指針指代的內(nèi)容為const, 內(nèi)容不可改變, 但指針本身的值可以改變; 后者為const指針, 指代的內(nèi)容可以改變, 指針本身的值不可改變。
總結(jié)
以上是生活随笔為你收集整理的c++ 二级指针详解&&hiredis api的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 刷脸支付的优势和弊端
- 下一篇: 如何画架构图?