求问一下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会把一个地址传递给它吧
这样的话为什么原型里形参要是指针的指针,直接是个指针不就行了吗... 看得出差别吗?#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;
} 你说第二个参数为什么不直接就是一个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 , 所以、明白了吗?
这其实就是老生常谈的问题,要修改掉函数外面的变量,通过传递变量的指针进去。
xiaotubie 发表于 2022-12-4 09:28
你说第二个参数为什么不直接就是一个char *类型是吧, 然后外面定义一个char* stop 把stop传进去,你是这 ...
明白了,所以谁指向stop根本不重要,这样子描述是为了让stop指向第一个非法字符,实参是stop的地址。
所以之后要输出后面字符串的话就直接*stop就可以了。
也可以声明一个char **p = &stop;然后第二个参数直接写p就行了,只是那样直接&stop又清晰又方便。
我就是奇怪stop指向第一个非法字符,第二个参数应该是指向stop的,可是我没见他们声明一个指针指向stop。
那这样子它直接把 &stop 给到strtol,这个地址给谁了?函数会自动创建一个临时指针吗,还是根本不需要指针只需要知道这个地址就够了?
感谢感谢 傻眼貓咪 发表于 2022-12-4 07:52
看得出差别吗?
感谢,非常的简单直观,他们没有绕那一下弯我就看的有点懵,谢谢 如月ya 发表于 2022-12-5 00:41
感谢,非常的简单直观,他们没有绕那一下弯我就看的有点懵,谢谢
{:10_254:}
页:
[1]