2013-04-21 253 views
1

是什么初始化变量X为char **和初始化变量X为char *,然后使用&引用它区别?这个问题来自以下查询:指向指针的指针与C中指针的地址有什么区别?

我在看男人3 strtol函数。函数签名是:

long strtol(const char *restrict str, char **restrict endptr, int base); 

因此,要通过endptr变量,我设置一个变量:

char **endptr; 

,但是当我把它传递给它总是返回NULL的功能,即使在str传递给strtol的情况类似于abc
即:

  char ** endptr; 
     long exitval = strtol(args[1], endptr, 10); /* try to get the val */ 
     if (endptr != NULL) { /* it wasn't a valid base-10 number */ 

然而,当我改变了我的初始化endptr到:

char *endptr; 

,然后通过endptr& endptr的功能,endptr设置正确。 IE:

  char * endptr; 
     long exitval = strtol(args[1], &endptr, 10); /* try to get the val */ 
     if (endptr != NULL) { /* it wasn't a valid base-10 number */ 

在两种情况下,我认为是我经过是的指针的指针在字符数组的第一个字符,但事实证明,一个方法工作,而另一个不表明我的理解不正确。

为什么一种方法有效,另一种不行?我误解了什么?

+4

你是如何初始化'** endptr'的? – Ryan 2013-04-21 15:35:07

+1

'strtol'的典型用法可能是'char * endptr = NULL; long l = strtol(buf,&endptr,10);'和Linux [strtol(3)](http://linux.die.net/man/3/strtol)手册页给出了一个完整的例子。 – 2013-04-21 15:37:08

+0

@minitech,编辑Q以包含所用代码的两个版本。 – Nate 2013-04-21 15:39:19

回答

3

我会有一个镜头。

函数strtol需要它可以写入的地址。

当你声明

char *ptr; 

您有一个名为ptr变量,当你通过它的地址,strtol可以写入到该位置,然后你可以通过查看变量的内容使用该值。

当你声明

char **ptr; 

,只是通过它的价值,首先你可能会传递一个未初始化值strtol将尝试写,其次,即使你初始化它你只传递它的内容 - strtol将修改它指向的位置,而不是变量本身的内容。

+0

感谢您的回答。稍微跟进一下:当你说“你传递的只是它的内容 - strtol会修改它指向的位置,而不是变量本身的内容”,你的意思是我传递了未初始化的值** PTR? – Nate 2013-04-21 15:53:18

+0

@Nate - 是的。如果你没有传递变量的地址,那么'strtol'不能修改它,就像当你将一个整型变量作为参数传递给一个函数一样,将该参数设置为另一个值不会改变该值返回时函数外部的变量。 – sje397 2013-04-21 15:56:39

+0

哎呀,谢谢!这清除了另一个QI在考虑re:参数 - 如果当您将参数传递给函数时,该函数会知道参数的地址以及参数的值,并从您的答案中推断出来,就像功能只知道其中一个一样。 – Nate 2013-04-21 16:01:16

1

在第一次,你没有给你的指针指针赋值,它是一个未初始化的值,你传递给strtol,第二次你定义一个指针,然后你得到它的地址,所以你传递的是endptr的地址。

另一种考虑它的方法是,你在内存中定义一个地方的地方是保存一个指向指针的指针,但是这个内存没有设置任何东西,然后你将这个垃圾传递给漫游。第二个是在内存中定义一个包含指针的地方,然后获取内存位的地址,然后将其传递给循环。

0

从手册页:

•若endptr不为NULL,与strtol()保存在* endptr第一个无效字符的地址。

在你传递这是初始化为0的endptrstrtol()值第一种情况,所以strtol()将不是第一个无效字符的地址存储在*endptr

在第二种情况下,您将endptr的地址传递给strtol()(它不是0),因此如果找到无效字符,它将不会返回NULL。

+0

谢谢。你的回答很有意义 - 我不清楚传递地址与价值的确切区别。 – Nate 2013-04-21 16:06:43