2013-12-23 36 views
-2
#include <stdio.h> 
#include <string.h> 
int main() { 
char str_a[20]; 
char *pointer; 
char *pointer2; 
strcpy(str_a, "Hello, world!\n"); 
pointer = str_a; 
printf(pointer); 
pointer2 = pointer + 2; 
printf(pointer2); 
strcpy(pointer2, "y you guys!\n"); 
printf(pointer); 
} 

Hi..can你能告诉我如何输出就这样产生:=这个输出如何?

Hello, world! 
llo, world! 
Hey you guys! 

其实我是新来的C.So发现它有点难以把握的指针。任何有关指针的帮助将不胜感激。谢谢。

+0

那么你到目前为止得到了什么结果呢?这是相当微不足道的。 – 2013-12-23 18:59:47

回答

4

第一招:

pointer = str_a; 
printf(pointer); 

pointer点 “!你好,沃尔德\ n”(str_a),从而得到打印的内容。

第二种:

pointer2 = pointer + 2; 
printf(pointer2); 

pointer2点2个字符pointer,这是 “你好!,沃尔德\ n” 个,所以llo world印刷

第三第三个字符之后

strcpy(pointer2, "y you guys!\n"); 
printf(pointer); 

现在,您将'y you guys'复制到pointer2的地址中,该地址仍然是两个char pointer,所以字符串的前两个字符仍然是相同的。从pointer2,例如

memory: H e l l o ,  w o r l d \ n 
     ^ ^
pointer-+  | 
pointer2------+ 

strcpy(pointer2, "y you guys!\n");覆盖第一个'l'

+0

+1,使用nit:'pointer2'指向'char'类型*的* 2个元素,而不是2个字节;请记住,指针算术是相对于基本类型的大小完成的,而不是原始字节。 –

+0

谢谢。我会更清楚 – MByD

0

第一个strcpy将引用的字符串常量复制到str_a缓冲区中。然后通过指向其开始的指针打印缓冲区。 pointer2被设置为将两个字符进一步指向缓冲区,而不是pointer(都是指向字符型指针的类型),然后打印来自第三个字符的缓冲区内容。

第二个strcpy将引用的字符串从第三个字符开始复制到缓冲区并覆盖以前的内容。请注意,前两个字符未被覆盖,因此当缓冲区的全部内容被写出时,它们就会显示出来。

0

指针是数字(通常是32位系统上的4个字节,64位系统上是8个字节),它们表示逻辑内存中的地址。例如,如果您有4GiB的内存可用,您的指针将包含从0到4294967295的值。您可以在C中指向不同类型的指针。指针的类型不影响它存储的地址,但它影响它将如何递增。根据系统上的int的大小,int *a; a += 1;将使a增加4个字节,或可能增加8个。

  1. strcpy(str_a, "Hello, world!\n");拷贝含有"Hello, world!\n"str_a缓冲器,这是一个指向20 char秒。 C中的数组只是指针,它们具有从数组地址开始预先分配的一些内存。
  2. pointer = str_a;使pointer指向与str_a相同的地址。
  3. pointer2 = pointer + 2;使pointer2指向与pointer相同的字符串中的两个字符。
  4. strcpy(pointer2, "y you guys!\n");用新文本替换除str_apointer中存储的原始字符串的前两个字符以外的所有字符,因为那是pointer2现在指向的位置。
+0

不,指针不是整数。 – 2013-12-23 19:00:05

+0

@ H2CO3。诚然,他们不是整数,但它们是整数量。我编辑了这篇文章。 –

0

首先,它是不好的做法,使用printf不使用%s符打印字符串。
现在就这个问题;

声明

strcpy(str_a, "Hello, world!\n"); 

"Hello, world!"复制字符串str_a

pointer = str_a; 

会将该字符串分配给pointerpointer指向字符串的第一个char,即H

printf(pointer); 

将打印字符串"Hello, world!"

pointer2 = pointer + 2; 

将增加2个单位到pointer现在pointer2将指向串"Hello, world!",即,l(拳头)的第三char。现在pointerpointer2指向相同的字符串"Hello, world!",但具有不同的起始地址。现在

strcpy(pointer2, "y you guys!\n"); 

将复制"y you guys!\n"pointer2和字符串"llo, world!"将成为"y you guys!"。因为由一个指向指针对象所做的任何更改反映到其所有的指针指向,因此,现在原始字符串"Hello, world!"将成为现在"Hey you guys!"及本声明

printf(pointer); 

将打印Hey you guys!

相关问题