首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char*数组的隐式衰减是什么?

char*数组的隐式衰减是什么?
EN

Stack Overflow用户
提问于 2021-02-17 21:56:17
回答 1查看 129关注 0票数 1

作为新手,我正在解决K&R的指针一章中的一个问题,并将其与字符指针的某些方面相混淆,并将char*类型的数组作为函数参数传递。

查阵衰变我理解

例如:

代码语言:javascript
复制
    void main( )
    {
        char a[ ] = "Howdy";

        tryMe(a);
    }

所以这里传递的函数参数是&一个

代码语言:javascript
复制
    void tryMe( char* s  )
    {
        printf("value I need: %c \n", *s);
    }

这就是s = &a;

现在,使用上面的理解,我尝试对char*类型的数组执行同样的操作。具有相同函数tryMe(char*)

例:

代码语言:javascript
复制
    char a[ ] = "Howdy";
    char b[ ] = "Doodie";

    char* a1 = a;
    char* b1 = b;

    char* AP[ ] = { a1 , b1 };

    //  now to pass array AP into the function tryMe::

   tryMe(AP);

这就是我得到警告的地方:

警告:从不兼容的指针类型传递‘tryMe’的参数1- type兼容-指针-类型

我不知道是怎么回事,但我做了下面的事情,让它运转得很好:

变函数定义

tryMe(char*)到tryMe(char**)

这个很好用。

另一个可行的解决方案是:

职能定义保持不变:

void tryMe(char*)

但是,在传递函数参数时,它如下所示:

代码语言:javascript
复制
    void tryMe( char* s[ ]  )
    {
       ;
    }

虽然这些改变如我所希望的那样起作用,但我不知道它们为什么会起作用

我真的很希望能就这些问题提供任何指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-17 22:37:29

char* AP[ ] = { a1 , b1 };AP定义为包含两个char *的数组。所以AP,而不是,是char的数组。在tryMe(AP);中,数组AP被转换为指向其第一个元素&AP[0]的指针。因为它的第一个元素是char *,所以指向它的指针具有char **类型。

char **不适合作为char *类型参数的参数传递,因此编译器会发出抱怨。

要传递其中一个数组(通过指向其第一个元素的指针),可以使用tryMe(AP[0])tryMe(AP[1])

如果您将函数定义更改为具有char **类型的参数,那么,比方说char **x,当您传递AP时,该函数将收到指向AP的第一个元素的指针。要获得相关数组中的字符,必须多次取消指针的引用:x是指向char *的指针,*xchar ***x是字符。

或者,x是指向数组第一个元素的指针,x[0]x[1]是该数组中的char *元素,x[0][0]是第一个char *指向的字符串的第一个字符,x[1][4]是第二个char *指向的字符串的第四个字符,依此类推。

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

https://stackoverflow.com/questions/66250506

复制
相关文章

相似问题

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