![](/img/trans.png)
[英]Difference between the address of a pointer and the address that a pointer contains
[英]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.