如月ya 发表于 2022-12-4 01:07:17

求问一下c语言里strtol()这个函数的参数问题

它原型是这样
long int strtol(const char *nptr, char **endptr, int base);
我看书上和各种教学贴里都是说,第二个参数endptr是一个指向指针的指针,它指向的那个指针指向第一个非法字符的地址
可是我看帖子中和书上使用的时候,都是把它声明为一个指针,然后第一个非法字符的地址直接作为实参传递给它
虽然我知道这样子简单一些,可是原型不应该是这样的呀,求解答

网上找的一个例子

char buffer="10379cend$3";
char *stop;
printf("%d/n",strtol(buffer, &stop, 2));
printf("%s/n", stop);
输出结果:
2
379cend$3
char *stop;
strtol(buffer,&stop,2);
是在说把stop声明为一个指向char类型数据的指针,然后strtol会把一个地址传递给它吧
这样的话为什么原型里形参要是指针的指针,直接是个指针不就行了吗...

傻眼貓咪 发表于 2022-12-4 07:52:34

看得出差别吗?#include <stdio.h>

void foo(int** num) {
        ;
}

int main(void) {
        int num = 5; // <--------------- 一个整数
        int* p = num; // <--------------- p 指向 num
        int** q = p; // <--------------- q 指向 p

        foo(&p);
        foo(q);

        return 0;
}

xiaotubie 发表于 2022-12-4 09:28:37

你说第二个参数为什么不直接就是一个char *类型是吧, 然后外面定义一个char* stop   把stop传进去,你是这个意思吧。

因为函数里面要给stop指针赋值,使它指向第一个非数字的字符。如果直接传进去一个stop修改的是stop的副本,没法修改到函数外面的stop变量
只有定义成char** endptr   然后通过&stop传进去以后,strtol函数里面通过*(&stop) =非数字字符的地址,才能真正的把stop修改掉

试想如果一个int a=1这样的变量怎么传给一个函数,使函数里面能修改掉变量a 呢    ?
是不是得这样定义    void update(int * v){ *v=2;}   然后通过这样调用函数update(&a);

所以你说的strtol   也一样啊,要修改掉char * stop这样的指针变量   那函数只能定义成char** endptr   ,再外面通过传进去&stop , 所以、明白了吗?
这其实就是老生常谈的问题,要修改掉函数外面的变量,通过传递变量的指针进去。



如月ya 发表于 2022-12-5 00:38:31

xiaotubie 发表于 2022-12-4 09:28
你说第二个参数为什么不直接就是一个char *类型是吧, 然后外面定义一个char* stop   把stop传进去,你是这 ...

明白了,所以谁指向stop根本不重要,这样子描述是为了让stop指向第一个非法字符,实参是stop的地址。
所以之后要输出后面字符串的话就直接*stop就可以了。
也可以声明一个char **p = &stop;然后第二个参数直接写p就行了,只是那样直接&stop又清晰又方便。
我就是奇怪stop指向第一个非法字符,第二个参数应该是指向stop的,可是我没见他们声明一个指针指向stop。
那这样子它直接把 &stop 给到strtol,这个地址给谁了?函数会自动创建一个临时指针吗,还是根本不需要指针只需要知道这个地址就够了?
感谢感谢

如月ya 发表于 2022-12-5 00:41:05

傻眼貓咪 发表于 2022-12-4 07:52
看得出差别吗?

感谢,非常的简单直观,他们没有绕那一下弯我就看的有点懵,谢谢

傻眼貓咪 发表于 2022-12-5 18:46:16

如月ya 发表于 2022-12-5 00:41
感谢,非常的简单直观,他们没有绕那一下弯我就看的有点懵,谢谢

{:10_254:}
页: [1]
查看完整版本: 求问一下c语言里strtol()这个函数的参数问题