1

作为一个新手,我正在解决 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**)

这很好用。

另一个有效的解决方案是:

函数定义保持不变::

无效 tryMe(char*)

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

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

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

我真的很感激任何关于这些的指导。

4

1 回答 1

1

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

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

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

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

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

于 2021-02-17T22:37:29.160 回答