簡體   English   中英

C使用char指針

[英]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

retn都是指向相同內存塊的指針。 它們的“值”只是內存地址-當您更改*n ,您將更改*ret ,即使nret保留其原始值。

//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不被設置到任何東西,字符串它所指向的內容來設置

nret是指針,這意味着它們包含地址。 在這種情況下,它們都包含使用malloc分配的同一字符緩沖區的地址。 從這個意義上講, nret是可互換的。

實際上,第3行分配了一個空字符串ret ,該字符串足以容納參數,即使它全是字母也是如此。 該字符串最終將被返回。 然后,該函數循環遍歷參數,如果是字母,則通過中間指針n將該參數放入返回字符串中,該中間指針跟蹤返回的字符串中的當前位置。

ret是指向要返回的字符串開頭的指針。 您需要創建另一個指針n ,因為該指針並不總是指向要返回的字符串的開頭,它將在其上移動,更改其字符。 並且,為了能夠返回字符串,您必須返回一個指向字符串開頭的指針,並且您需要知道它的結尾(這就是為什么您需要在結尾添加0的原因)。

希望我能幫上忙!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM