添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在C语言入门教材里看到这一段代码,没看懂是什么意思。
char buffer[10];
char *pbuffer = buffer;
while( (*pbuffer++ = getchar() )!= '\n');
*pbuffer = '\0';
尤其是第三段while( (*pbuffer++ = getchar() )!= '\n'); 这里的getchar取的是什么数据,是我输入的数据吗?*pbuffer是一个指针数组吗,是不是存了输入的所有信息?

*buffer不是指针数组,是一个字符型的指针,让指针pbuffer指向了数组buffer的首地址,那么*pbuffer就跟buffer[0]是等价的,而pbuffer++的意思就是让pbuffer指向当前所指的下一个单元。也就是说执行完pbuffer++以后,*pbuffer就和buffer[1]等价。

while( (*pbuffer++ = getchar() )!= '\n');的作用是读取输入的字符到buffer中,遇到换行符停止读取。
getchar的意思是读取一个字符变量并返回,

那这段代码执行完之后,*pbuffer这个指针存的是什么内容?
未知的。
执行完*pbuffer = getchar()后 pbuffer又自加了一次,此时pbuffer是指向的地址是'\n'的下一个元素的地址,而这个值你的代码里边并没有给出结果,所以是未知的。

 指针的学习(四)——指针处理字符串 

1、指针处理字符串

我们可以用char类型的数组变量存储字符串,也可以使用char类型的指针变量引用字符串。这个方法在处理字符串时非常灵活。如下所示:

char *pString = NULL;

注意,指针只是一个存储另一个内存位置的地址变量。前面只创建了指针,没有指定一个存储字符串的地方。要存储字符串,需要分配一些内存。可以声明一块内存,来存储字符串数据,然后使用指针追踪这块存储字符串的内存。

1、使用指针更多的控制字符串输入

在读取文本时,常需要比scanf()函数更多的控制。在<stdio.h>中声明的getchar()函数提供了非常基本的操作,一次只读取一个字符,但是它可控制何时停止读入字符。这样就可以确保不会超过存储输入而分配的内存。

getchar()函数从键盘读入一个字符,并以int类型返回。可以把一个结尾‘\n'的字符串读入所定义的数组中。如下

char buffer[100];

char *pbuffer = buffer;

while((*pbuffer++ = getchar() != '\n');

*pbuffer = '\0';

所有的输入都在while循环的条件中完成。getchar()函数读取一个字符,并它存储在pbuffer的当前地址中。然后,递增pbuffer中的地址,以指向下一个字符。在循环结束后,将'\0'字符添加到下一个可用的位置上。

2、使用指针数组

处理多个字符串时,可以在堆上使用指针数组存储对字符串的引用。下面用一个例子来说明

int i;
printf ( "\\nEnter 3 messages that total less than %u characters." , BUFFER_LEN - 2);
for (i = 0; i < 3; i++)
printf ( "\\nEnter %s message\\n" , i > 0 ? "another" : "a" );
pS[i] = &buffer[index];
for (; index < BUFFER_LEN; index++)
if ((*(pbuffer + index) = getchar ()) == '\\n' )
*(pbuffer + index++) = '\\0' ;
break ;
if ((index == BUFFER_LEN) && ((*(pbuffer + index - 1) != '\\0' ) || (i < 2)))
printf ( "\\nYou ran out of space in the buffer." );
return 1;
printf ( "\\nThe string you entered are:\\n\\n" );
for (i = 0; i < 3; i++)
printf ( "%s\\n" , pS[i]);
printf ( "The buffer has %d characters unused.\\n" , BUFFER_LEN - index);
return 0;

首先定义全局变量BUFFER_LEN指定buffer数组的大小

const size_t BUFFER_LEN = 512;

这个变量必须声明为const,才能用来指定数组大小;数组的大小只能用常量式来指定。

接着就是主函数定义

int i = 0;
printf ( "\\nYou can enter up to %u message each up to %u characters." , NUM_P, BUFFER_LEN - 1);
for (i = 0; i < NUM_P; i++)
pbuffer = buffer;
printf ( "\\nEnter %s message, or press Enter to end\\n" , i > 0 ? "another" : "a" );
while ((pbuffer - buffer < BUFFER_LEN - 1) && ((*pbuffer++ = getchar ()) != '\\n' ));
if ((pbuffer - buffer) < 2)
break ;
if ((pbuffer - buffer) == BUFFER_LEN && *(pbuffer - 1) != '\\n' )
printf ( "String too long - maxmum %d Characters allowed." , BUFFER_LEN);
*(pbuffer - 1) = '\\0' ;
pS[i] = ( char *) malloc (pbuffer - buffer);
if (pS[i] == NULL)
printf ( "\\nOut of memory - ending program." );
return 1;
strcpy (pS[i],buffer);
printf ( "\\nIn reverse order, the string you entered are:\\n" );
while (--i >= 0)
printf ( "\\n%s" , pS[i]);
free (pS[i]);
pS[i] = NULL;
return 0;
}</pre>
<pre class = "brush:cpp;" >输出的结果如下:</pre>
<pre class = "brush:cpp;" >
<pre class = "brush:cpp;" >You can enter up to 100 message each up to 127 characters.
Enter a message, or press Enter to end
12344555;34344
Enter another message, or press Enter to end
zidfjdjfadifda
Enter another message, or press Enter to end
fdfjdjfdsa
Enter another message, or press Enter to end
In reverse order, the string you entered are:
fdfjdjfdsa
zidfjdjfadifda
12344555;34344</pre>
<pre class = "brush:as3;" > char buffer[BUFFER_LEN];
char *pS[NUM_P] = { NULL };
char *pbuffer = buffer;
int i = 0;</pre>
<pre class = "brush:as3;" >buffer数组只是一个输入缓冲区,含有每个读入的字符串。因此#define指令将BUFFER_LEN定义为能接受的字符串最大长度。然后,声明指针数组的长度NUM_P和指针puffer,以用于buffer数组。最后是两个循环控制变量。</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" > printf ( "\\nYou can enter up to %u message each up to %u characters." , NUM_P, BUFFER_LEN - 1);</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" >输入信息的最大长度允许加上终止字符。</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" >第一个 for 循环读入字符串并存储它们。这个循环控制如下:</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" > for (i = 0; i < NUM_P; i++)</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" >这能确保输入的字符串不超过前面声明的指针数量。一旦输入的字符串数到达最大字符串数,循环就会结束,进入程序的输出部分。</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" >在循环中,字符串输入使用类似 getchar ()的机制,但是多了一个额外的条件:</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" > while ((pbuffer - buffer < BUFFER_LEN - 1) && ((*pbuffer++ = getchar ()) != '\n' ));</pre>
<pre class = "brush:cpp;" style= "text-indent:24px;" >整个过程发生在 while 循环的条件式中。由 getchar ()得到的字符存储在pbuffer指向的地址中,pbuffer最初保存的是buffer的地址。然后递增pbuffer指针,指向下一个可用的空间,这个赋值语句所存储的字符与 '\n' 比较,若该字符是 '\n' ,就结束循环。如果pbuffer - buffer < BUFFER_LEN - 1 是 false ,循环也会结束。即如果下一个要存储的字符占据了buffer数组的最后一个位置,循环也会结束。</pre>

指针错误会产生灾难性的结果。如果使用一个没有指定地址值的未初始化指针存储值,该指针使用的地址就是存储在该指针位置的任何内容,这可能是内存中的任何一个位置。

好了,关于指针的内容先简单的说到这里。

指针的学习(四)——指针处理字符串-ZhouliS-ChinaUnix博客 http://blog.chinaunix.net/uid-26835614-id-3480657.html