什么是 char* 数组的隐式衰减?
What is the implicit decay of char* arrays?
作为新手,我正在解决 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);
这是我收到警告的地方:
warning: passing argument 1 of ‘tryMe’ from incompatible pointer type [-Wincompatible-pointer-types]
我不确定发生了什么,但我确实通过执行以下操作使其正常工作:
从
更改函数定义
tryMe(char*)
to
tryMe(char**)
这很好用。
另一个可行的解决方案是:
函数定义保持不变::
void tryMe(char*)
但是在传递函数参数时,它如下所示::
void tryMe( char* s[ ] )
{
;
}
尽管上述这些更改按我希望的方式工作,但我不知道它们为什么起作用
我非常感谢任何关于这些的指导。
char* AP[ ] = { a1 , b1 };
定义 AP
为包含两个 char *
的数组。所以 AP
是 而不是 char
的数组。在 tryMe(AP);
中,数组 AP
被转换为指向其第一个元素 &AP[0]
的指针。因为它的第一个元素是 char *
,指向它的指针的类型是 char **
.
A 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 *
指向的字符串的第四个字符,依此类推。
作为新手,我正在解决 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);
这是我收到警告的地方:
warning: passing argument 1 of ‘tryMe’ from incompatible pointer type [-Wincompatible-pointer-types]
我不确定发生了什么,但我确实通过执行以下操作使其正常工作:
从
更改函数定义tryMe(char*) to tryMe(char**)
这很好用。
另一个可行的解决方案是:
函数定义保持不变::
void tryMe(char*)
但是在传递函数参数时,它如下所示::
void tryMe( char* s[ ] )
{
;
}
尽管上述这些更改按我希望的方式工作,但我不知道它们为什么起作用
我非常感谢任何关于这些的指导。
char* AP[ ] = { a1 , b1 };
定义 AP
为包含两个 char *
的数组。所以 AP
是 而不是 char
的数组。在 tryMe(AP);
中,数组 AP
被转换为指向其第一个元素 &AP[0]
的指针。因为它的第一个元素是 char *
,指向它的指针的类型是 char **
.
A 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 *
指向的字符串的第四个字符,依此类推。