繁体   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