繁体   English   中英

将“指针指向指针”和“指针地址”传递给函数之间的区别

[英]Difference between passing “pointer to pointer” and “address of pointer” to a function

我有一个带char **的函数; 它在内部使用它来维护连续调用之间的上下文。

定义char **x并将x传递给它,与定义char *x并传递&x什么区别?


对于上下文:在阅读源代码之前,我尝试自己在strtok手册页上实现示例。 而且我遇到了段错误。 然后经过尝试,我查看了源代码。

问题是我定义了char **x并将x作为**saveptr参数传递,但是将定义更改为char *x并传递给&x解决了问题。

到底是什么问题?

第一个版本,带有char **x; 并传递x ,创建并使用未初始化的指向char的指针。
第二个版本,带有char * x; 并传递&x ,创建指向char的未初始化指针,但是传递一个值,该值是指向char的指针的有效地址,并且是定义的值(即,类似于指向未初始化的指向char的指针的指针)。

基本上,对于第一个版本,您要求在内存中的“随机”位置进行写(这是获得段错误的几乎肯定的方法); 其次,您要求写入现有的指针变量。

当您定义例如

char **x;

然后,您只需定义一个指针。 它不是指向另一个指针的指针,重要的是它只是一个指针。 因此,使用上面显示的定义,它尚未初始化。 它没有特别之处。 像在函数中最有可能那样取消引用它会导致未定义的行为

另一方面,像

char *x;

并使用&x指向它的指针, &x返回的指针指向有效的变量x 取消引用&x将允许该函数访问和修改x本身。

以这种方式使用address-of运算符是一种模拟C所没有的按引用传递的方式。

因为所有函数参数都 C中的值传递 ,所以如果您定义char **x并传递x ,则函数将不会对其进行修改。 如果定义char *x并传递&x ,则可以对其进行修改(更改其指向地址)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM