作为新手,我正在解决K&R的指针一章中的一个问题,并将其与字符指针的某些方面相混淆,并将char*类型的数组作为函数参数传递。
查阵衰变我理解
例如:
void main( )
{
char a[ ] = "Howdy";
tryMe(a);
}所以这里传递的函数参数是&一个
void tryMe( char* s )
{
printf("value I need: %c \n", *s);
}这就是s = &a;
现在,使用上面的理解,我尝试对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);这就是我得到警告的地方:
警告:从不兼容的指针类型传递‘tryMe’的参数1- type兼容-指针-类型
我不知道是怎么回事,但我做了下面的事情,让它运转得很好:
变函数定义
tryMe(char*)到tryMe(char**)
这个很好用。
另一个可行的解决方案是:
职能定义保持不变:
void tryMe(char*)
但是,在传递函数参数时,它如下所示:
void tryMe( char* s[ ] )
{
;
}虽然这些改变如我所希望的那样起作用,但我不知道它们为什么会起作用
我真的很希望能就这些问题提供任何指导。
发布于 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 *的指针,*x是char *,**x是字符。
或者,x是指向数组第一个元素的指针,x[0]和x[1]是该数组中的char *元素,x[0][0]是第一个char *指向的字符串的第一个字符,x[1][4]是第二个char *指向的字符串的第四个字符,依此类推。
https://stackoverflow.com/questions/66250506
复制相似问题