首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向指向数组(?)的指针。

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

Stack Overflow用户
提问于 2017-03-24 20:33:52
回答 2查看 123关注 0票数 0

如果标题没有100%正确,请原谅我。我有一个函数,它接受两个输入--一个指向字符串的指针,一个指向数组(?)的指针。我写的功能是

int string_parser(char *inp, char **array_of_words[])

我想要做的是接受这两个参数,函数应该返回

  1. 字符串数组中的字数(string数组为char *inp)
  2. 指向指针数组的指针char **array_of_words[] -数组中的每个元素指向每个单词中第一个字符的地址(如果这是文字,我很抱歉) 我已经创建了指向指针数组的指针,并为这个数组分配了空间。 char **startOfWords_ptr = (char **) malloc(amountOfWords * sizeof(char*)); 一直在操纵内容。我现在想把*start_of_words上的数组传回给array_of_words,但是我不知道怎么做

使用*array_of_words = *(startOfWords_ptr);,我是说:指针指向指针数组的起始地址吗?

我当然不是因为我在印刷时没有得到相同的价值.

代码语言:javascript
复制
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

以意见作为产出的建议

代码语言:javascript
复制
*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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-24 22:05:39

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

代码语言:javascript
复制
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的原型需要

代码语言:javascript
复制
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

代码语言:javascript
复制
*array_of_words = startOfWords_ptr; // char ** = char **

array_of_words的间接方向比startOfWords_ptr多一个级别,因此我们需要取消引用它以获得匹配的类型。在这次任务之后,

代码语言:javascript
复制
*array_of_words[i] == startOfWords_ptr[i] // char * == char *
票数 1
EN

Stack Overflow用户

发布于 2017-03-24 21:35:53

函数签名中的这个参数:

代码语言:javascript
复制
char **array_of_words[]

可以重写为:

代码语言:javascript
复制
char ***array_of_words

也就是说,要么把它写成:

代码语言:javascript
复制
char **array_of_words

或作为:

代码语言:javascript
复制
char *array_of_words[]

这非常类似于编写main()的第二个参数的不同方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43008662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档