下面有一些代码:
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中的情况吗?
答案 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 **
之后的转换。