在某些情况下,我应该在哪里使用char **作为输入参数?

时间:2017-08-19 03:30:50

标签: c unix

下面有一些代码:

main ()
  {
    char in[8];
    char out[255];
    iconv_t cd;
    cd = iconv_open("gb18030", "utf-8");     
        ...
    char *p_in = in;
    char *p_out = out;
    size_t inlen = strlen(in);
    size_t outlen = sizeof(out);
    if (iconv(cd, &p_in, &inlen, &p_out, &outlen) < 0)
    {
          ...
        return -1
    }
          ...
        return 0;
  }

我无法完全理解iconv来电的第二和第三个参数。为什么**指针不是*指针作为输入?当应该使用**指针时,任何人都可以解释C中的情况吗?

1 个答案:

答案 0 :(得分:4)

指向指针的指针用于需要在被调用函数中修改传递指针的位置,并且需要在调用函数中看到该修改。这是必需的,因为C参数是按值传递的。因此,当一个参数传递给一个函数时,它只是复制到函数的参数并创建一个具有块作用域的本地副本。在已经传递的参数中将看不到对该变量的任何更改。

void foo(in x){
    x = 10;
}

int main(void){
     int x = 5;
     foo(x)
     printf("%d\n", x);  // x will be 5
}

指针

也是如此
void bar(char *p){
    p = "foobar";
}

int main(void){
     char *p = NULL;
     bar(p);
     if(p)
         printf("p is pointing to %s\n", p);
     else 
         printf("p is NULL\n");   // This will 
}

使用指向指针的指针将执行所需的工作(将p指向字符串"foobar"

void bar(char ** p){         * p =&#34; foobar&#34 ;;     }

int main(void){
     char *p = NULL;
     bar(&p);
     if(p)
         printf("p is pointing to %s\n", p);
     else 
         printf("p is NULL\n");   // This will 
}  

另一个用途是需要将一个字符串数组传递给一个函数。喜欢

int main(int argc, char **argv)  

void print_fruits(char **fruits, size_t len){
    for(int i = 0; i < len; i++)
        printf("%s\n", fruits[i]);
}

int main(void){
    char *fruits[5] = {"Apple", "Banana", "Cherry", "Kiwi", "Orange"};
    print_fruits(fruits, sizeof(fruits)/sizeof(fruits[0]));
}

请注意,在函数调用print_fruits中,参数列表中的fruits将衰减到指向其第一个元素的指针,而表达式fruits将变为类型char **之后的转换。