[英]What is the implicit decay of char* arrays?
作為一個新手,我正在解決 K&R 的指針章節中的一個問題,並且對字符指針的某些方面感到困惑,並將一個 char* 類型的數組作為 function 參數傳遞。
我明白的字符數組衰減
前任:
void main( )
{
char a[ ] = "Howdy";
tryMe(a);
}
所以這里傳遞的 function 參數是&a[0]
void tryMe( char* s )
{
printf("value I need: %c \n", *s);
}
所以這將是s = &a[0];
現在使用上述理解,我嘗試對 char* 類型的數組執行相同的操作。 使用相同的 function 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
我不確定發生了什么,但我確實通過執行以下操作使其正常工作:
從更改 function 定義
tryMe(char*) 到 tryMe(char**)
這很好用。
另一個有效的解決方案是:
Function 定義保持不變::
無效 tryMe(char*)
但是在傳遞 function 參數時,它如下所示:
void tryMe( char* s[ ] )
{
;
}
盡管上述這些更改按我的意願工作,但我不知道它們為什么工作
我真的很感激任何關於這些的指導。
char* AP[ ] = { a1, b1 };
將AP
定義為包含兩個char *
的數組。 所以AP
不是一個char
數組。 在tryMe(AP);
,數組AP
被轉換為指向其第一個元素&AP[0]
的指針。 由於它的第一個元素是char *
,指向它的指針具有char **
類型。
char **
不適合作為char *
類型參數的參數傳遞,因此編譯器會抱怨。
要傳遞 arrays 之一(通過指向其第一個元素的指針),您可以使用tryMe(AP[0])
或tryMe(AP[1])
。
如果您將 function 定義更改為具有char **
類型的參數,那么例如char **x
,當您傳遞AP
時,function 將收到指向AP
的第一個元素的指針。 要獲取相關數組中的字符,它必須多次取消引用指針: x
是指向char *
的指針, *x
是char *
, **x
是一個字符。
或者, x
是指向數組第一個元素的指針, x[0]
和x[1]
是該數組中的char *
元素, x[0][0]
是指向的字符串的第一個字符第一個char *
, x[1][4]
是第二個char *
指向的字符串的第四個字符,依此類推。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.