如果标题不是100%正确,请原谅我。我有一个函数,它接受两个输入 - 一个指向字符串的指针,一个指向数组指针的指针(?)。我写的功能是
int string_parser(char *inp, char **array_of_words[])
我想要做的是获取这两个参数,函数应该返回
char *inp
)char **array_of_words[]
的指针 - 数组中的每个元素指向每个单词中第一个字符的地址(如果这是罗嗦,我道歉)char **startOfWords_ptr = (char **) malloc(amountOfWords * sizeof(char*));
*start_of_words
的数组传递回array_of_words
- 但我不明白该怎么做我用*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
答案 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_words
与char **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_words
比startOfWords_ptr
还有一个间接级别,因此我们需要取消引用它以使类型匹配。完成这项任务后,
*array_of_words[i] == startOfWords_ptr[i] // char * == char *