请教C语言二级指针“(void **)&”的问题?

……
char *pBuf;
HANDLE hBuffer;
……
i = (int)recvnc(s, (void **)&pBuf, 0, &hBuffer);

函数recvnc的功能是从网口接收数据存到pBuf里,函数是封装到lib库里的,具体定义找不到.

我用printf输出pBuf的内容进行查看, printf输出结果如斜杠后所示。:
printf("%s\n",(void **)&pBuf); //输出为乱码
printf("%s\n",(void **)&pBuf[0]); //从第一个字节开始显示接收到的字符串
printf("%s\n",(void **)(&pBuf)[0]); //从第一个字节开始显示接收到的字符串
printf("%s\n",(void **)&(pBuf[0])); //从第一个字节开始显示接收到的字符串
printf("%s\n",(void **)&pBuf[1]); //从第二个字节开始显示接收到的字符串
printf("%d\n",*pBuf[0]); //编译出错error #76: operand of "*" must be a pointer

请问:
(1)目前输出的都是字符串,如果我想按字节提取接收数据,该如何取?
(2)(void **)&pBuf是一种什么用法?感觉(void **)&pBuf实际上等同于*pBuf,为什么加“(void **)&”?
(3)pBuf已经被定义成"char *",printf("%d\n",*pBuf[0]); 中“*pBuf[0]”为何还会出错?

谢谢高人的指教!

(1)循环打印 pBuf[i]就可以按字节取字符,i从0开始直到pBuf[i] == '\0' 为止。
(2)你列的例子中,(void **)&pBuf只在 i = (int)recvnc(s, (void **)&pBuf, 0, &hBuffer); 这一句里面有意义,在printf里面加(void **)是多此一举毫无意义,你直接printf("%s\n",pBuf);就能打印字符串了。在recvnc函数形参礼用(void **)强制转换是因为函数声明要求形参必须是void **,在printf里面还用(void **)是错的。
(3)pBuf是char *,pBuf[0]就是char,*pBuf[0]的用法相当于把pBuf[0]这个char当作指针来用,当然是错的。追问

谢谢
不好意思我再多问一句:"void **"是一种什么用法?网上查了一下,感觉太绕了

追答

void **就是指向指针的指针,感觉绕是因为没真正理解*和&的使用语法。
*和&用在类型(包括类型定义和类型转换)时和用在运算符时候表达的含义不一样。
用在类型上时,*表示类型为指针,&表示类型为引用;
用在运算符上时,*表示取内容操作,&表示取地址操作,互为逆运算;
从你前面问的第2和第3个问题可以估计到,你混淆了*和&分别用在类型和用在运算符上的意义,所以才会感觉绕。
void **p和**p完全是两个意思,从便于理解角度出发的话,void **p应该写成 void** p,**这里是用来修饰前面的类型void的,表示p的类型是void**,而**p里的**则是对后面的变量p进行了两次取内容操作。

追问

明白了!您说到点子上了,连教科书都讲不到这么透彻。谢谢!

温馨提示:答案为网友推荐,仅供参考
相似回答