微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确地引用作为地址传递给函数的char **指针?

如何解决如何正确地引用作为地址传递给函数的char **指针?

我正在编写一个使用char **设置多维数组的程序。 然后,我将char **的地址传递给另一个函数来使用。

在通过地址将**指针传递给另一个函数之后,如何正确地引用它们呢?

错误
C字符串数组
分割错误

int test(char *** strings){
    puts(*strings[0]);
    puts(*strings[1]);
    return 1;
}

int main(void) {

    char arr[][25] =
    { "array of c string","is fun to use","make sure to properly","tell the array size"
    };
    
    
  char ** strings = (char**)malloc(2 * sizeof(char*));
  
  strings[0] = (char*)malloc(25 * sizeof(char));
  strcpy(strings[0],arr[0]);
  
  strings[1] = (char*)malloc(25 * sizeof(char));
  strcpy(strings[1],arr[1]);
  
  test(&strings);

  return 1;
}

*如果有人将其插入C ++游乐场,则强制释放Malloc

解决方法

这有效:

int test(char *** strings){
    puts((*strings)[0]);
    puts((*strings)[1]);
    return 1;
}

由于[]的绑定比*的绑定更紧密,因此您需要先取消引用。参见https://en.cppreference.com/w/c/language/operator_precedence

,

通过指针将指针strings传递到函数test没有太大意义,因为指针本身在函数中未更改。

返回类型int也没有意义。

至少可以像这样声明和定义函数

void test( char ** strings )
{
    puts( strings[0] );
    puts( strings[1] );
}

并称呼为

test( strings );

尽管如此,如果您希望通过引用传递指针,那么puts的调用可能看起来像

    puts( ( *strings )[0] );
    puts( ( *strings )[1] );

首先,您需要取消引用指针以获取在strings中声明的原始指针main,然后将下标运算符应用于获得的原始指针,

,

您可以使用数组符号,它看起来更好,IMO:

int test(char ***strings){
    puts(strings[0][0]);
    puts(strings[0][1]);
    return 1;
}

假设您要更改字符:

strings[0][1][1] = 'z';

这将更改第二个字符串的第二个字符(索引1),然后为:

iz fun to use
 ^

如果目标只是访问数据而不是修改数据,则按值传递指针就足够了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。