指向数组指针的指针(?)

时间:2017-03-24 20:33:53

标签: c arrays pointers

如果标题不是100%正确,请原谅我。我有一个函数,它接受两个输入 - 一个指向字符串的指针,一个指向数组指针的指针(?)。我写的功能是
int string_parser(char *inp, char **array_of_words[])
我想要做的是获取这两个参数,函数应该返回

  1. 字符串数组中的单词数量(字符串数组为char *inp
  2. 指向指针数组char **array_of_words[]的指针 - 数组中的每个元素指向每个单词中第一个字符的地址(如果这是罗嗦,我道歉)
    我已经创建了指向指针数组的指针,并为此数组分配了空间 char **startOfWords_ptr = (char **) malloc(amountOfWords * sizeof(char*));
    并且一直在操纵内容。我现在想将*start_of_words的数组传递回array_of_words - 但我不明白该怎么做
  3. 我用*array_of_words = *(startOfWords_ptr);说:指向指向数组起始地址的指针?
    当然,我不是因为我在打印时得不到相同的值......

    printf("%p\n", (void *) *array_of_words); // 0x401f2c, o
    printf("%p\n", (void *) *startOfWords_ptr); // 0x401f2c, o
    
    printf("%p\n", (void *) array_of_words[1]); // 0x401f2c, o
    printf("%p\n", (void *) startOfWords_ptr[1]); // 0x401f30, t
    

    以评论作为输出的建议

    *array_of_words =  (startOfWords_ptr); // This currently does not work
    
    printf("%p, %c\n", (void *) array_of_words[0], *array_of_words[0]); // 0xcbbdd0, ;
    printf("%p, %c\n", (void *) startOfWords_ptr[0], *startOfWords_ptr[0]); // 0x401f3b, o
    
    printf("%p, %c\n", (void *) array_of_words[1], *array_of_words[1]); // 0x401f2c, o
    printf("%p, %c\n", (void *) startOfWords_ptr[1], *startOfWords_ptr[1]); // 0x401f3f, t
    

2 个答案:

答案 0 :(得分:1)

函数签名中的此参数:

char **array_of_words[]

可以重写为:

char ***array_of_words

即。把它写成:

char **array_of_words

或作为:

char *array_of_words[]

这与写main()的第二个参数的不同方式非常相似。

答案 1 :(得分:1)

好的,让我们从这个函数的调用者的角度来看这个:

int main( void )
{
  char my_input[] = "This is a test";
  char **my_output = NULL;

  int count = string_parser( my_input, &my_output );
  for ( int i = 0; i < count; i++ )
    printf( "pointer #%d: %p\n", i, (void *) my_output[i] );
}

我们知道在调用string_parser后,my_output将指向指向char的指针序列中的第一个。由于我们需要修改my_output的值,我们必须在调用中传递指向它的指针(&my_output)。

这意味着string_parser的原型需要

int string_parser( const char *inp, char ***array_of_words ) 
{
   ...
}

在函数参数声明的上下文中,T a[N]T a[]都被视为T *a,因此char ***array_of_wordschar **array_of_words[]相同 - 两者都是最终char ***

所以给出

  

我已经创建了指针数组的指针,并为此数组分配了空间   char **startOfWords_ptr = (char **) malloc(amountOfWords * sizeof(char*));   并且一直在操纵内容。我现在想将*start_of_words的数组传递回array_of_words - 但我不明白该怎么做

你倒退了 - 你将startOfWords_ptr分配给*array_of_words

*array_of_words = startOfWords_ptr; // char ** = char **

array_of_wordsstartOfWords_ptr还有一个间接级别,因此我们需要取消引用它以使类型匹配。完成这项任务后,

*array_of_words[i] == startOfWords_ptr[i] // char * == char *