[英]C Working with char pointers
只是在上一堂課時用了一些C語言,而我遇到了一些讓我抓不住頭腦的事情。 對於此代碼:
char * findString(const char * s){
/* Allocate space */
char * ret = malloc(strlen(s) + 1);
/* Copy characters */
char * n;
n = ret;
for ( ;*s != 0; s++)
if (isLetter(*s))
*n++ = *s;
*n = 0;
/* return pointer to beginning of string */
return ret;
}
(我們只是假設一個isLetter返回1/0)。
該代碼段的想法是獲取一個帶有一堆廢話的字符串,然后返回僅包含字母的字符串。
那么,“ ret”在這種情況下如何工作? 當在for循環上方聲明“ n = ret”並且“ ret”以后再也不會設置為任何值時,我對返回的“ ret”感到非常困惑。 顯然我在這里錯過了一些東西。 救命!
-RL
ret
和n
都是指向相同內存塊的指針。 它們的“值”只是內存地址-當您更改*n
,您將更改*ret
,即使n
和ret
保留其原始值。
//make n point to the beginning of the block of memory pointed
//to by ret
n = ret;
//iterate through the string which was passed to
//the function
for ( ;*s != 0; s++)
//if the current character is a letter:
if (isLetter(*s))
//set the character pointed to by n to
//the current character in the string, and then
//make n point to the next one.
*n++ = *s;
請注意,循環將遞增n
,然后在循環之后將最后一個字符設置為0(以null終止字符串)。 現在, n
指向字符串的結束-但因為ret
從未改變它仍指向內存的開始,你malloc
循環之前編輯。 返回時,您將返回一個指向新字符串的指針,該字符串是您傳遞給函數的字符串,減去所有非字母。
請注意,此函數返回后, free()
函數分配的內存是調用者的責任,以免漫游到內存泄漏中。
ret在語義上是一個字符串,實際上是指向該字符串第一個字符的指針。 n用作指向該字符串中當前位置的指針。 因此,ret保持指向字符串的開頭,而n沿字符串填充時沿字符串移動。 *n = 0
然后添加空終止符。 因此,雖然RET不被設置到任何東西,字符串它所指向的內容來設置 。
n
和ret
是指針,這意味着它們包含地址。 在這種情況下,它們都包含使用malloc
分配的同一字符緩沖區的地址。 從這個意義上講, n
和ret
是可互換的。
實際上,第3行分配了一個空字符串ret
,該字符串足以容納參數,即使它全是字母也是如此。 該字符串最終將被返回。 然后,該函數循環遍歷參數,如果是字母,則通過中間指針n
將該參數放入返回字符串中,該中間指針跟蹤返回的字符串中的當前位置。
ret
是指向要返回的字符串開頭的指針。 您需要創建另一個指針n
,因為該指針並不總是指向要返回的字符串的開頭,它將在其上移動,更改其字符。 並且,為了能夠返回字符串,您必須返回一個指向字符串開頭的指針,並且您需要知道它的結尾(這就是為什么您需要在結尾添加0
的原因)。
希望我能幫上忙!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.