C语言 将“指针到指针”和“指针地址”传递给函数之间的区别



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

定义char **x并向其传递x与定义char *x并传递&x有什么区别?


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

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

问题到底出在哪里?

第一个版本,带有char **x;和传递x,创建并使用一个未初始化的指针到指向字符的指针。
第二个版本,带有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,则可以对其进行修改(更改其指向地址)。

相关内容

  • 没有找到相关文章

最新更新