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

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

如何解决char* 数组的隐式衰减是什么?

作为新手,我正在解决 K&R 的指针章节中的一个问题,并且对字符指针的某些方面以及将 char* 类型的数组作为函数参数传递感到困惑。

我理解的字符数组衰减

例如:

    void main( )
    {
        char a[ ] = "Howdy";

        tryMe(a);
    }

所以这里传递的函数参数是&a[0]

    void tryMe( char* s  )
    {
        printf("value I need: %c \n",*s);
    }

所以这将是 s = &a[0];

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

例如::

    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);

这是我收到警告的地方:

警告:从不兼容的指针类型 [-Wincompatible-pointer-types] 传递“tryMe”的参数 1

我不确定发生了什么,但我确实通过执行以下操作使其正常工作:

改变函数定义

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

这很好用。

一个有效的解决方案是:

函数定义保持不变::

void tryMe(char*)

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

    void tryMe( char* s[ ]  )
    {
       ;
    }

尽管上述这些更改按我的意愿起作用,但我不知道它们为什么起作用

我非常感谢您提供有关这些方面的任何指导。

解决方法

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 *指向的字符串的第四个字符,依此类推。

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