如何解决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 *
的指针,*x
是 char *
,并且**x
是一个字符。
或者,x
是指向数组第一个元素的指针,x[0]
和 x[1]
是该数组中的 char *
元素,x[0][0]
是第一个char *
指向的字符串的第一个字符,x[1][4]
是第二个char *
指向的字符串的第四个字符,依此类推。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。