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